asyncfunctionpublicRows(){return(awaitdatabase.all<PublicRow>(`SELECT s.id,s.provider,s.region,s.bucket,s.public_base_url,s.cdn_domain,s.path_prefix,s.status,s.test_status,s.test_message,s.last_tested_at,u.display_name AS created_by_name,s.created_at,s.activated_at,1 AS has_credentials FROM storage_configs s JOIN users u ON u.id=s.created_by ORDER BY CASE s.status WHEN 'active' THEN 0 WHEN 'draft' THEN 1 ELSE 2 END,s.id DESC`)).map((item)=>({...item,id:Number(item.id),has_credentials:Boolean(item.has_credentials)}))}
router.post('/:configId/test',requireRole('platform_admin'),async(req:AuthRequest,res:Response)=>{constid=Number(req.params.configId);constconfig=awaitdatabase.one<StorageConfigRecord>('SELECT id,region,bucket,public_base_url,cdn_domain,path_prefix,secret_id_encrypted,secret_key_encrypted FROM storage_configs WHERE id=? AND status!=?',[id,'archived']);if(!config){res.status(404).json({error:'存储配置不存在'});return}try{constmessage=awaittestStorageConfig(config);awaitdatabase.execute("UPDATE storage_configs SET test_status='passed',test_message=?,last_tested_at=? WHERE id=?",[message,newDate().toISOString(),id]);awaitaudit(req,'storage_config.test_passed','storage_config',id,{bucket:config.bucket});res.json({success:true,test_status:'passed',test_message:message})}catch(error){constmessage=errorinstanceofError?error.message:'COS 连接测试失败';awaitdatabase.execute("UPDATE storage_configs SET test_status='failed',test_message=?,last_tested_at=? WHERE id=?",[message,newDate().toISOString(),id]);awaitaudit(req,'storage_config.test_failed','storage_config',id,{bucket:config.bucket,message});res.status(400).json({error:message,test_status:'failed'})}});
router.post('/:configId/activate',requireRole('platform_admin'),async(req:AuthRequest,res:Response)=>{constid=Number(req.params.configId);constconfig=awaitdatabase.one<{id:number;bucket:string;test_status:string}>('SELECT id,bucket,test_status FROM storage_configs WHERE id=? AND status=?',[id,'draft']);if(!config){res.status(404).json({error:'待启用的存储配置不存在'});return}if(config.test_status!=='passed'){res.status(409).json({error:'连接测试通过后才能启用该配置'});return}awaitwithTransaction(async(tx)=>{awaittx.execute("UPDATE storage_configs SET status='archived' WHERE status='active'");awaittx.execute("UPDATE storage_configs SET status='active',activated_at=? WHERE id=?",[newDate().toISOString(),id])});awaitaudit(req,'storage_config.activate','storage_config',id,{bucket:config.bucket});res.json({success:true})});