{"openapi":"3.0.0","paths":{"/api/auth/register":{"post":{"operationId":"AuthController_register","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDto"}}}},"responses":{"200":{"description":""}},"tags":["Auth"]}},"/api/auth/resend-verification-code":{"post":{"operationId":"AuthController_resendVerificationCode","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendVerificationCodeDto"}}}},"responses":{"200":{"description":""}},"tags":["Auth"]}},"/api/auth/verify-email":{"post":{"operationId":"AuthController_verifyEmail","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailDto"}}}},"responses":{"200":{"description":""}},"tags":["Auth"]}},"/api/auth/login":{"post":{"operationId":"AuthController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"200":{"description":""}},"tags":["Auth"]}},"/api/auth/refresh":{"post":{"operationId":"AuthController_refresh","parameters":[],"responses":{"200":{"description":""}},"tags":["Auth"]}},"/api/auth/logout":{"post":{"operationId":"AuthController_logout","parameters":[],"responses":{"200":{"description":""}},"tags":["Auth"]}},"/api/auth/me":{"get":{"operationId":"AuthController_me","parameters":[],"responses":{"200":{"description":""}},"tags":["Auth"]}},"/api/auth/forgot-password":{"post":{"operationId":"AuthController_forgotPassword","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordDto"}}}},"responses":{"200":{"description":""}},"tags":["Auth"]}},"/api/auth/reset-password":{"post":{"operationId":"AuthController_resetPassword","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordDto"}}}},"responses":{"200":{"description":""}},"tags":["Auth"]}},"/api/skills/public/tags":{"get":{"operationId":"SkillsController_findPublicTags","parameters":[],"responses":{"200":{"description":""}},"tags":["Skills"]}},"/api/skills/public":{"get":{"operationId":"SkillsController_findPublic","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"pageSize","required":true,"in":"query","schema":{"type":"string"}},{"name":"q","required":true,"in":"query","schema":{"type":"string"}},{"name":"tag","required":true,"in":"query","schema":{"type":"string"}},{"name":"sort","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Skills"]}},"/api/skills/public/{slug}":{"get":{"operationId":"SkillsController_findPublicBySlug","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Skills"]}},"/api/skills/public/{slug}/star":{"post":{"operationId":"SkillsController_toggleStar","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Skills"]}},"/api/skills/public/{slug}/like":{"post":{"operationId":"SkillsController_toggleLike","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Skills"]}},"/api/skills/public/{slug}/me":{"get":{"operationId":"SkillsController_getUserInteraction","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Skills"]}},"/api/skills/public/{slug}/files":{"get":{"operationId":"SkillsController_getPublicFiles","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Skills"]}},"/api/skills/public/{slug}/comments":{"get":{"operationId":"SkillsController_getComments","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"pageSize","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Skills"]},"post":{"operationId":"SkillsController_createComment","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCommentDto"}}}},"responses":{"201":{"description":""}},"tags":["Skills"]}},"/api/skills/public/comments/{commentId}":{"delete":{"operationId":"SkillsController_deleteComment","parameters":[{"name":"commentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Skills"]}},"/api/skills/public/{slug}/download/count":{"post":{"operationId":"SkillsController_incrementDownload","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Skills"]}},"/api/skills/public/{slug}/download":{"get":{"operationId":"SkillsController_download","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Skills"]}},"/api/skills/public/{slug}/install":{"post":{"operationId":"SkillsController_install","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Skills"]},"delete":{"operationId":"SkillsController_uninstall","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Skills"]}},"/api/skills":{"post":{"operationId":"SkillsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSkillDto"}}}},"responses":{"201":{"description":""}},"tags":["Skills"]}},"/api/skills/mine":{"get":{"operationId":"SkillsController_findMine","parameters":[],"responses":{"200":{"description":""}},"tags":["Skills"]}},"/api/skills/{id}":{"get":{"operationId":"SkillsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Skills"]},"patch":{"operationId":"SkillsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSkillDto"}}}},"responses":{"200":{"description":""}},"tags":["Skills"]},"delete":{"operationId":"SkillsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Skills"]}},"/api/skills/{id}/versions":{"post":{"operationId":"SkillsController_createVersion","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVersionDto"}}}},"responses":{"201":{"description":""}},"tags":["Skills"]},"get":{"operationId":"SkillsController_findVersions","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Skills"]}},"/api/skills/{id}/versions/upload":{"post":{"operationId":"SkillsController_uploadVersion","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Skills"]}},"/api/skills/{id}/versions/{versionId}/files":{"get":{"operationId":"SkillsController_getVersionFiles","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"versionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Skills"]}},"/api/skills/{id}/versions/{versionId}/files/{fileId}":{"get":{"operationId":"SkillsController_getVersionFileContent","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"versionId","required":true,"in":"path","schema":{"type":"string"}},{"name":"fileId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Skills"]}},"/api/skills/{id}/versions/{versionId}/publish":{"post":{"operationId":"SkillsController_publishVersion","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"versionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Skills"]}},"/api/users/me":{"get":{"operationId":"UsersController_getMe","parameters":[],"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["Users"]},"patch":{"operationId":"UsersController_updateMe","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileDto"}}}},"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["Users"]}},"/api/users/me/avatar":{"post":{"operationId":"UsersController_uploadAvatar","parameters":[],"responses":{"201":{"description":""}},"security":[{"ss_at":[]}],"tags":["Users"]},"delete":{"operationId":"UsersController_removeAvatar","parameters":[],"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["Users"]}},"/api/users/me/stars":{"get":{"operationId":"UsersController_getMyStars","parameters":[],"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["Users"]}},"/api/users/me/installs":{"get":{"operationId":"UsersController_getMyInstalls","parameters":[],"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["Users"]}},"/api/admin/setup/status":{"get":{"operationId":"AdminController_getSetupStatus","parameters":[],"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["Admin"]}},"/api/admin/setup":{"post":{"operationId":"AdminController_setup","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSetupDto"}}}},"responses":{"201":{"description":""}},"security":[{"ss_at":[]}],"tags":["Admin"]}},"/api/admin/stats":{"get":{"operationId":"AdminController_getStats","parameters":[],"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["Admin"]}},"/api/admin/users":{"get":{"operationId":"AdminController_listUsers","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"pageSize","required":true,"in":"query","schema":{"type":"string"}},{"name":"q","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["Admin"]}},"/api/admin/users/{id}/ban":{"patch":{"operationId":"AdminController_banUser","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["Admin"]}},"/api/admin/users/{id}/unban":{"patch":{"operationId":"AdminController_unbanUser","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["Admin"]}},"/api/admin/users/{id}/role":{"patch":{"operationId":"AdminController_setUserRole","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["Admin"]}},"/api/admin/skills":{"get":{"operationId":"AdminController_listSkills","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"pageSize","required":true,"in":"query","schema":{"type":"string"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"q","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["Admin"]}},"/api/admin/skills/{id}/archive":{"patch":{"operationId":"AdminController_archiveSkill","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["Admin"]}},"/api/admin/skills/{id}/restore":{"patch":{"operationId":"AdminController_restoreSkill","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["Admin"]}},"/api/admin/skills/{id}":{"delete":{"operationId":"AdminController_deleteSkill","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["Admin"]}},"/api/api-clients":{"get":{"operationId":"ApiClientsController_findAll","parameters":[],"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["API Clients"]},"post":{"operationId":"ApiClientsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiClientDto"}}}},"responses":{"201":{"description":""}},"security":[{"ss_at":[]}],"tags":["API Clients"]}},"/api/api-clients/{id}/status":{"patch":{"operationId":"ApiClientsController_updateStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApiClientStatusDto"}}}},"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["API Clients"]}},"/api/api-clients/{id}":{"delete":{"operationId":"ApiClientsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"ss_at":[]}],"tags":["API Clients"]}},"/api/v1/skills":{"get":{"operationId":"PublicApiController_list","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"pageSize","required":true,"in":"query","schema":{"type":"string"}},{"name":"q","required":true,"in":"query","schema":{"type":"string"}},{"name":"tag","required":true,"in":"query","schema":{"type":"string"}},{"name":"sort","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"tags":["Public API (v1)"]}},"/api/v1/skills/{slug}/manifest":{"get":{"operationId":"PublicApiController_manifest","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"version","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"tags":["Public API (v1)"]}},"/api/v1/skills/{slug}":{"get":{"operationId":"PublicApiController_detail","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"version","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"tags":["Public API (v1)"]}},"/api/setup/status":{"get":{"operationId":"SetupController_status","parameters":[],"responses":{"200":{"description":""}},"tags":["Setup"]}},"/api/setup/test-db":{"post":{"operationId":"SetupController_testDb","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestDbDto"}}}},"responses":{"201":{"description":""}},"tags":["Setup"]}},"/api/setup/test-smtp":{"post":{"operationId":"SetupController_testSmtp","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSmtpDto"}}}},"responses":{"201":{"description":""}},"tags":["Setup"]}},"/api/setup/submit":{"post":{"operationId":"SetupController_submit","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitSetupDto"}}}},"responses":{"201":{"description":""}},"tags":["Setup"]}}},"info":{"title":"Skill Store API","description":"Skill Store 后端 REST API。\n\n- **浏览器**：登录后通过 Cookie `ss_at` 访问需鉴权接口（`credentials: include`）。\n- **第三方**：在控制台创建 API Key，请求头携带 `x-api-key` 访问 `/api/v1/*` 只读接口。\n\n所有 JSON 响应经统一包装：`{ success, data, error }`。","version":"1.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"api-key":{"type":"apiKey","in":"header","name":"x-api-key","description":"API Key（前缀 ssk_），创建时仅展示一次明文"},"cookie":{"type":"apiKey","in":"cookie","name":"ss_at","description":"登录成功后由服务端 Set-Cookie"}},"schemas":{"RegisterDto":{"type":"object","properties":{}},"ResendVerificationCodeDto":{"type":"object","properties":{}},"VerifyEmailDto":{"type":"object","properties":{}},"LoginDto":{"type":"object","properties":{}},"ForgotPasswordDto":{"type":"object","properties":{}},"ResetPasswordDto":{"type":"object","properties":{}},"CreateCommentDto":{"type":"object","properties":{}},"CreateSkillDto":{"type":"object","properties":{}},"UpdateSkillDto":{"type":"object","properties":{}},"CreateVersionDto":{"type":"object","properties":{}},"UpdateProfileDto":{"type":"object","properties":{}},"AdminSetupDto":{"type":"object","properties":{}},"CreateApiClientDto":{"type":"object","properties":{}},"UpdateApiClientStatusDto":{"type":"object","properties":{}},"TestDbDto":{"type":"object","properties":{}},"TestSmtpDto":{"type":"object","properties":{}},"SubmitSetupDto":{"type":"object","properties":{}}}}}