robodev 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/package.json +1 -1
  2. package/src/collect-files.test.ts +19 -0
  3. package/src/collect-files.ts +1 -0
  4. package/src/config.test.ts +26 -0
  5. package/src/config.ts +34 -5
  6. package/src/emit-starter.test.ts +68 -0
  7. package/src/emit-starter.ts +47 -13
  8. package/src/index.ts +45 -4
  9. package/templates/auth-chat/.config/local.spa.template.yml +27 -0
  10. package/templates/auth-chat/.oxlint-base.json +29 -0
  11. package/templates/auth-chat/.oxlintrc.json +78 -0
  12. package/templates/auth-chat/.rulesync/rules/frontend-api-boundary.md +36 -0
  13. package/templates/auth-chat/.rulesync/rules/frontend-component-structure.md +38 -0
  14. package/templates/auth-chat/.rulesync/rules/frontend-forms.md +32 -0
  15. package/templates/auth-chat/.rulesync/rules/frontend-notifications.md +24 -0
  16. package/templates/auth-chat/.rulesync/rules/frontend-povio-components.md +42 -0
  17. package/templates/auth-chat/.rulesync/rules/frontend-povio-ui.md +45 -0
  18. package/templates/auth-chat/.rulesync/rules/frontend-query-autocomplete.md +29 -0
  19. package/templates/auth-chat/.rulesync/rules/frontend-tables-and-lists.md +34 -0
  20. package/templates/auth-chat/.rulesync/rules/frontend-translations.md +26 -0
  21. package/templates/auth-chat/.rulesync/rules/project-overview.md +32 -0
  22. package/templates/auth-chat/.rulesync/rules/robodev-api.md +30 -0
  23. package/templates/auth-chat/.rulesync/rules/robodev-auth.md +40 -0
  24. package/templates/auth-chat/.rulesync/rules/robodev-database.md +22 -0
  25. package/templates/auth-chat/.rulesync/rules/role-based-app-structure.md +36 -0
  26. package/templates/auth-chat/.rulesync/skills/media-feature/SKILL.md +21 -0
  27. package/templates/auth-chat/.rulesync/skills/povio-ui-styling/SKILL.md +208 -0
  28. package/templates/auth-chat/.rulesync/skills/povio-ui-styling/agents/openai.yaml +4 -0
  29. package/templates/auth-chat/.rulesync/skills/robodev-api-route/SKILL.md +13 -0
  30. package/templates/auth-chat/.rulesync/skills/robodev-table/SKILL.md +12 -0
  31. package/templates/auth-chat/README.md +26 -7
  32. package/templates/auth-chat/api/invite.ts +43 -0
  33. package/templates/auth-chat/apps/fe/index.html +24 -0
  34. package/templates/auth-chat/apps/fe/openapi-codegen.config.ts +37 -0
  35. package/templates/auth-chat/apps/fe/package.json +82 -0
  36. package/templates/auth-chat/apps/fe/public/apple-touch-icon.png +0 -0
  37. package/templates/auth-chat/apps/fe/public/favicon-96x96.png +0 -0
  38. package/templates/auth-chat/apps/fe/public/favicon.ico +0 -0
  39. package/templates/auth-chat/apps/fe/public/favicon.svg +3 -0
  40. package/templates/auth-chat/apps/fe/public/site.webmanifest +21 -0
  41. package/templates/auth-chat/apps/fe/public/web-app-manifest-192x192.png +0 -0
  42. package/templates/auth-chat/apps/fe/public/web-app-manifest-512x512.png +0 -0
  43. package/templates/auth-chat/apps/fe/src/assets/fonts/GeneralSans-Bold.otf +0 -0
  44. package/templates/auth-chat/apps/fe/src/assets/fonts/GeneralSans-Medium.otf +0 -0
  45. package/templates/auth-chat/apps/fe/src/assets/fonts/GeneralSans-Regular.otf +0 -0
  46. package/templates/auth-chat/apps/fe/src/assets/fonts/GeneralSans-Semibold.otf +0 -0
  47. package/templates/auth-chat/apps/fe/src/assets/locales/en/translation.json +202 -0
  48. package/templates/auth-chat/apps/fe/src/assets/locales/sl/translation.json +202 -0
  49. package/templates/auth-chat/apps/fe/src/clients/app-rest-client.ts +15 -0
  50. package/templates/auth-chat/apps/fe/src/clients/auth-token-store.ts +101 -0
  51. package/templates/auth-chat/apps/fe/src/clients/rest/app-error-handler.ts +31 -0
  52. package/templates/auth-chat/apps/fe/src/clients/rest/interceptors/authorization-header.interceptor.ts +15 -0
  53. package/templates/auth-chat/apps/fe/src/clients/rest/interceptors/refresh-token.interceptor.ts +37 -0
  54. package/templates/auth-chat/apps/fe/src/clients/rest/interceptors/response.interceptor.ts +17 -0
  55. package/templates/auth-chat/apps/fe/src/components/404.tsx +18 -0
  56. package/templates/auth-chat/apps/fe/src/components/features/auth/AuthBrandPanel.tsx +60 -0
  57. package/templates/auth-chat/apps/fe/src/components/features/auth/AuthLayout.tsx +23 -0
  58. package/templates/auth-chat/apps/fe/src/components/features/auth/LoginPage.tsx +111 -0
  59. package/templates/auth-chat/apps/fe/src/components/features/auth/RegisterPage.tsx +143 -0
  60. package/templates/auth-chat/apps/fe/src/components/features/chat/ChatPage.tsx +105 -0
  61. package/templates/auth-chat/apps/fe/src/components/features/chat/InviteForm.tsx +84 -0
  62. package/templates/auth-chat/apps/fe/src/components/features/profile/ProfilePage.tsx +96 -0
  63. package/templates/auth-chat/apps/fe/src/components/googleAnalytics/GoogleAnalytics.tsx +35 -0
  64. package/templates/auth-chat/apps/fe/src/components/layout/AppLayout.tsx +19 -0
  65. package/templates/auth-chat/apps/fe/src/components/layout/app-header/AppHeader.tsx +91 -0
  66. package/templates/auth-chat/apps/fe/src/components/layout/app-header/MobileNavigation.tsx +51 -0
  67. package/templates/auth-chat/apps/fe/src/components/layout/app-header/NavLink.tsx +29 -0
  68. package/templates/auth-chat/apps/fe/src/components/shared/branding/BrandLogo.tsx +13 -0
  69. package/templates/auth-chat/apps/fe/src/components/shared/error/ErrorFallback.tsx +43 -0
  70. package/templates/auth-chat/apps/fe/src/components/shared/error/ErrorText.tsx +20 -0
  71. package/templates/auth-chat/apps/fe/src/components/shared/error/NotFound.tsx +36 -0
  72. package/templates/auth-chat/apps/fe/src/components/shared/forms/RequiredLabel.tsx +21 -0
  73. package/templates/auth-chat/apps/fe/src/components/shared/forms/RowInputWrapper.tsx +50 -0
  74. package/templates/auth-chat/apps/fe/src/components/shared/head/AppHead.tsx +32 -0
  75. package/templates/auth-chat/apps/fe/src/components/shared/head/DefaultAppHead.tsx +34 -0
  76. package/templates/auth-chat/apps/fe/src/components/shared/layout/LoadingState.tsx +9 -0
  77. package/templates/auth-chat/apps/fe/src/components/shared/layout/ThinPageWrapper.tsx +5 -0
  78. package/templates/auth-chat/apps/fe/src/components/shared/page/PageHeader.tsx +69 -0
  79. package/templates/auth-chat/apps/fe/src/components/shared/ui/Card.tsx +60 -0
  80. package/templates/auth-chat/apps/fe/src/components/shared/ui/GoogleLoginButton.tsx +19 -0
  81. package/templates/auth-chat/apps/fe/src/components/shared/ui/RequiredLabel.tsx +22 -0
  82. package/templates/auth-chat/apps/fe/src/components/shared/ui/TableActions.tsx +22 -0
  83. package/templates/auth-chat/apps/fe/src/config/app.config.ts +35 -0
  84. package/templates/auth-chat/apps/fe/src/config/i18n.ts +43 -0
  85. package/templates/auth-chat/apps/fe/src/config/inits/a11y.ts +14 -0
  86. package/templates/auth-chat/apps/fe/src/config/inits/logger.ts +7 -0
  87. package/templates/auth-chat/apps/fe/src/config/inits/sentry.ts +21 -0
  88. package/templates/auth-chat/apps/fe/src/config/jwt.config.ts +2 -0
  89. package/templates/auth-chat/apps/fe/src/config/query.config.ts +20 -0
  90. package/templates/auth-chat/apps/fe/src/hooks/useAuth.ts +5 -0
  91. package/templates/auth-chat/apps/fe/src/main.tsx +52 -0
  92. package/templates/auth-chat/apps/fe/src/pages/(guest)/login.tsx +23 -0
  93. package/templates/auth-chat/apps/fe/src/pages/(guest)/register.tsx +23 -0
  94. package/templates/auth-chat/apps/fe/src/pages/(guest)/route.tsx +18 -0
  95. package/templates/auth-chat/apps/fe/src/pages/(private)/index.tsx +23 -0
  96. package/templates/auth-chat/apps/fe/src/pages/(private)/profile.tsx +23 -0
  97. package/templates/auth-chat/apps/fe/src/pages/(private)/route.tsx +18 -0
  98. package/templates/auth-chat/apps/fe/src/pages/(public)/auth.tsx +37 -0
  99. package/templates/auth-chat/apps/fe/src/pages/(public)/route.tsx +9 -0
  100. package/templates/auth-chat/apps/fe/src/pages/__root.tsx +164 -0
  101. package/templates/auth-chat/apps/fe/src/providers/AppErrorBoundary.tsx +10 -0
  102. package/templates/auth-chat/apps/fe/src/providers/OpenApiRuntimeProvider.tsx +31 -0
  103. package/templates/auth-chat/apps/fe/src/providers/index.tsx +44 -0
  104. package/templates/auth-chat/apps/fe/src/providers/jwt.provider.tsx +95 -0
  105. package/templates/auth-chat/apps/fe/src/routeTree.gen.ts +225 -0
  106. package/templates/auth-chat/apps/fe/src/styles/base.css +103 -0
  107. package/templates/auth-chat/apps/fe/src/styles/fonts/fonts.tsx +10 -0
  108. package/templates/auth-chat/apps/fe/src/styles/fonts/general-sans.css +31 -0
  109. package/templates/auth-chat/apps/fe/src/styles/globals.css +28 -0
  110. package/templates/auth-chat/apps/fe/src/styles/overrides/defaults/button.override.ts +536 -0
  111. package/templates/auth-chat/apps/fe/src/styles/overrides/defaults/checkbox.override.ts +71 -0
  112. package/templates/auth-chat/apps/fe/src/styles/overrides/defaults/input.override.ts +252 -0
  113. package/templates/auth-chat/apps/fe/src/styles/overrides/defaults/label.override.ts +91 -0
  114. package/templates/auth-chat/apps/fe/src/styles/overrides/defaults/modal.override.ts +57 -0
  115. package/templates/auth-chat/apps/fe/src/styles/overrides/defaults/radio.override.ts +46 -0
  116. package/templates/auth-chat/apps/fe/src/styles/overrides/defaults/table.override.ts +104 -0
  117. package/templates/auth-chat/apps/fe/src/styles/overrides/defaults/tag.override.ts +66 -0
  118. package/templates/auth-chat/apps/fe/src/styles/overrides/defaults/typography.override.ts +115 -0
  119. package/templates/auth-chat/apps/fe/src/styles/overrides/outline.clsx.ts +10 -0
  120. package/templates/auth-chat/apps/fe/src/styles/overrides/uiOverrides.override.ts +60 -0
  121. package/templates/auth-chat/apps/fe/src/styles/theme.css +2177 -0
  122. package/templates/auth-chat/apps/fe/src/types/i18next.d.ts +12 -0
  123. package/templates/auth-chat/apps/fe/src/types/table.d.ts +17 -0
  124. package/templates/auth-chat/apps/fe/src/types/ui.d.ts +26 -0
  125. package/templates/auth-chat/apps/fe/src/types/vite-env.d.ts +20 -0
  126. package/templates/auth-chat/apps/fe/src/utils/date.utils.ts +17 -0
  127. package/templates/auth-chat/apps/fe/src/utils/number.utils.ts +12 -0
  128. package/templates/auth-chat/apps/fe/src/utils/string.utils.ts +5 -0
  129. package/templates/auth-chat/apps/fe/src/vite-env.d.ts +1 -0
  130. package/templates/auth-chat/apps/fe/tsconfig.app.json +32 -0
  131. package/templates/auth-chat/apps/fe/tsconfig.json +9 -0
  132. package/templates/auth-chat/apps/fe/tsconfig.node.json +31 -0
  133. package/templates/auth-chat/apps/fe/vite.config.ts +94 -0
  134. package/templates/auth-chat/openapi.json +1016 -0
  135. package/templates/auth-chat/oxfmt.config.js +23 -0
  136. package/templates/auth-chat/package.json +6 -13
  137. package/templates/auth-chat/rulesync.jsonc +18 -0
  138. package/templates/auth-chat/tsconfig.json +2 -4
  139. package/templates/backend/README.md +2 -2
  140. package/templates/backend/api/_lib.ts +359 -0
  141. package/templates/backend/api/aliens/labels.ts +19 -0
  142. package/templates/backend/api/files/presigned-url.ts +48 -0
  143. package/templates/backend/api/files/upload.ts +29 -0
  144. package/templates/backend/api/planets/[id]/like.ts +36 -0
  145. package/templates/backend/api/planets/[id].ts +56 -13
  146. package/templates/backend/api/planets/paginate.ts +36 -0
  147. package/templates/backend/api/planets.ts +52 -44
  148. package/templates/backend/database.ts +33 -13
  149. package/templates/backend/package.json +1 -1
  150. package/templates/catalog.json +3 -3
  151. package/templates/empty/package.json +1 -1
  152. package/templates/space/.config/local.spa.template.yml +27 -0
  153. package/templates/space/.oxlint-base.json +29 -0
  154. package/templates/space/.oxlintrc.json +78 -0
  155. package/templates/space/.rulesync/rules/frontend-api-boundary.md +36 -0
  156. package/templates/space/.rulesync/rules/frontend-component-structure.md +38 -0
  157. package/templates/space/.rulesync/rules/frontend-forms.md +32 -0
  158. package/templates/space/.rulesync/rules/frontend-notifications.md +24 -0
  159. package/templates/space/.rulesync/rules/frontend-povio-components.md +42 -0
  160. package/templates/space/.rulesync/rules/frontend-povio-ui.md +45 -0
  161. package/templates/space/.rulesync/rules/frontend-query-autocomplete.md +29 -0
  162. package/templates/space/.rulesync/rules/frontend-tables-and-lists.md +34 -0
  163. package/templates/space/.rulesync/rules/frontend-translations.md +26 -0
  164. package/templates/space/.rulesync/rules/project-overview.md +32 -0
  165. package/templates/space/.rulesync/rules/robodev-api.md +30 -0
  166. package/templates/space/.rulesync/rules/robodev-auth.md +40 -0
  167. package/templates/space/.rulesync/rules/robodev-database.md +22 -0
  168. package/templates/space/.rulesync/rules/role-based-app-structure.md +36 -0
  169. package/templates/space/.rulesync/skills/media-feature/SKILL.md +21 -0
  170. package/templates/space/.rulesync/skills/povio-ui-styling/SKILL.md +208 -0
  171. package/templates/space/.rulesync/skills/povio-ui-styling/agents/openai.yaml +4 -0
  172. package/templates/space/.rulesync/skills/robodev-api-route/SKILL.md +13 -0
  173. package/templates/space/.rulesync/skills/robodev-table/SKILL.md +12 -0
  174. package/templates/space/README.md +26 -7
  175. package/templates/space/api/_lib.ts +359 -0
  176. package/templates/space/api/aliens/labels.ts +19 -0
  177. package/templates/space/api/files/presigned-url.ts +48 -0
  178. package/templates/space/api/files/upload.ts +29 -0
  179. package/templates/space/api/planets/[id]/like.ts +36 -0
  180. package/templates/space/api/planets/[id].ts +56 -13
  181. package/templates/space/api/planets/paginate.ts +36 -0
  182. package/templates/space/api/planets.ts +52 -44
  183. package/templates/space/apps/fe/index.html +24 -0
  184. package/templates/space/apps/fe/openapi-codegen.config.ts +37 -0
  185. package/templates/space/apps/fe/package.json +82 -0
  186. package/templates/space/apps/fe/public/apple-touch-icon.png +0 -0
  187. package/templates/space/apps/fe/public/favicon-96x96.png +0 -0
  188. package/templates/space/apps/fe/public/favicon.ico +0 -0
  189. package/templates/space/apps/fe/public/favicon.svg +3 -0
  190. package/templates/space/apps/fe/public/site.webmanifest +21 -0
  191. package/templates/space/apps/fe/public/web-app-manifest-192x192.png +0 -0
  192. package/templates/space/apps/fe/public/web-app-manifest-512x512.png +0 -0
  193. package/templates/space/apps/fe/src/assets/fonts/GeneralSans-Bold.otf +0 -0
  194. package/templates/space/apps/fe/src/assets/fonts/GeneralSans-Medium.otf +0 -0
  195. package/templates/space/apps/fe/src/assets/fonts/GeneralSans-Regular.otf +0 -0
  196. package/templates/space/apps/fe/src/assets/fonts/GeneralSans-Semibold.otf +0 -0
  197. package/templates/space/apps/fe/src/assets/locales/en/translation.json +301 -0
  198. package/templates/space/apps/fe/src/assets/locales/sl/translation.json +301 -0
  199. package/templates/space/apps/fe/src/clients/app-rest-client.ts +15 -0
  200. package/templates/space/apps/fe/src/clients/auth-token-store.ts +101 -0
  201. package/templates/space/apps/fe/src/clients/rest/app-error-handler.ts +31 -0
  202. package/templates/space/apps/fe/src/clients/rest/interceptors/authorization-header.interceptor.ts +15 -0
  203. package/templates/space/apps/fe/src/clients/rest/interceptors/refresh-token.interceptor.ts +37 -0
  204. package/templates/space/apps/fe/src/clients/rest/interceptors/response.interceptor.ts +17 -0
  205. package/templates/space/apps/fe/src/components/404.tsx +18 -0
  206. package/templates/space/apps/fe/src/components/features/auth/AuthBrandPanel.tsx +60 -0
  207. package/templates/space/apps/fe/src/components/features/auth/AuthLayout.tsx +23 -0
  208. package/templates/space/apps/fe/src/components/features/auth/LoginPage.tsx +111 -0
  209. package/templates/space/apps/fe/src/components/features/auth/RegisterPage.tsx +143 -0
  210. package/templates/space/apps/fe/src/components/features/home/HomePage.tsx +21 -0
  211. package/templates/space/apps/fe/src/components/features/planets/details/PlanetDetailsPage.tsx +139 -0
  212. package/templates/space/apps/fe/src/components/features/planets/details/PlanetEditPage.tsx +266 -0
  213. package/templates/space/apps/fe/src/components/features/planets/feed/PlanetFeedCard.tsx +131 -0
  214. package/templates/space/apps/fe/src/components/features/planets/feed/PlanetsFeedPage.tsx +119 -0
  215. package/templates/space/apps/fe/src/components/features/planets/list/PlanetCard.tsx +89 -0
  216. package/templates/space/apps/fe/src/components/features/planets/list/PlanetCreateModal.tsx +179 -0
  217. package/templates/space/apps/fe/src/components/features/planets/list/PlanetsFilters.css +3 -0
  218. package/templates/space/apps/fe/src/components/features/planets/list/PlanetsFilters.tsx +73 -0
  219. package/templates/space/apps/fe/src/components/features/planets/list/PlanetsGridPage.tsx +51 -0
  220. package/templates/space/apps/fe/src/components/features/planets/list/PlanetsInfiniteTablePage.tsx +79 -0
  221. package/templates/space/apps/fe/src/components/features/planets/list/PlanetsPage.tsx +65 -0
  222. package/templates/space/apps/fe/src/components/features/planets/list/PlanetsTablePage.tsx +72 -0
  223. package/templates/space/apps/fe/src/components/features/planets/list/PlanetsTableSummary.tsx +29 -0
  224. package/templates/space/apps/fe/src/components/features/planets/list/PlanetsViewTabs.tsx +79 -0
  225. package/templates/space/apps/fe/src/components/features/planets/list/table/PlanetsTable.tsx +30 -0
  226. package/templates/space/apps/fe/src/components/features/planets/list/table/PlanetsTableActions.tsx +64 -0
  227. package/templates/space/apps/fe/src/components/features/planets/list/table/PlanetsTableInfinite.tsx +36 -0
  228. package/templates/space/apps/fe/src/components/features/planets/list/table/planetsTableColumns.tsx +72 -0
  229. package/templates/space/apps/fe/src/components/features/planets/list/table/usePlanetTableFilters.tsx +102 -0
  230. package/templates/space/apps/fe/src/components/features/profile/ProfilePage.tsx +96 -0
  231. package/templates/space/apps/fe/src/components/googleAnalytics/GoogleAnalytics.tsx +35 -0
  232. package/templates/space/apps/fe/src/components/layout/AppLayout.tsx +19 -0
  233. package/templates/space/apps/fe/src/components/layout/app-header/AppHeader.tsx +93 -0
  234. package/templates/space/apps/fe/src/components/layout/app-header/MobileNavigation.tsx +53 -0
  235. package/templates/space/apps/fe/src/components/layout/app-header/NavLink.tsx +29 -0
  236. package/templates/space/apps/fe/src/components/shared/branding/BrandLogo.tsx +13 -0
  237. package/templates/space/apps/fe/src/components/shared/error/ErrorFallback.tsx +43 -0
  238. package/templates/space/apps/fe/src/components/shared/error/ErrorText.tsx +20 -0
  239. package/templates/space/apps/fe/src/components/shared/error/NotFound.tsx +36 -0
  240. package/templates/space/apps/fe/src/components/shared/forms/RequiredLabel.tsx +21 -0
  241. package/templates/space/apps/fe/src/components/shared/forms/RowInputWrapper.tsx +50 -0
  242. package/templates/space/apps/fe/src/components/shared/head/AppHead.tsx +32 -0
  243. package/templates/space/apps/fe/src/components/shared/head/DefaultAppHead.tsx +34 -0
  244. package/templates/space/apps/fe/src/components/shared/layout/LoadingState.tsx +9 -0
  245. package/templates/space/apps/fe/src/components/shared/layout/ThinPageWrapper.tsx +5 -0
  246. package/templates/space/apps/fe/src/components/shared/page/PageHeader.tsx +69 -0
  247. package/templates/space/apps/fe/src/components/shared/ui/Card.tsx +60 -0
  248. package/templates/space/apps/fe/src/components/shared/ui/GoogleLoginButton.tsx +19 -0
  249. package/templates/space/apps/fe/src/components/shared/ui/RequiredLabel.tsx +22 -0
  250. package/templates/space/apps/fe/src/components/shared/ui/TableActions.tsx +22 -0
  251. package/templates/space/apps/fe/src/config/app.config.ts +35 -0
  252. package/templates/space/apps/fe/src/config/i18n.ts +43 -0
  253. package/templates/space/apps/fe/src/config/inits/a11y.ts +14 -0
  254. package/templates/space/apps/fe/src/config/inits/logger.ts +7 -0
  255. package/templates/space/apps/fe/src/config/inits/sentry.ts +21 -0
  256. package/templates/space/apps/fe/src/config/jwt.config.ts +2 -0
  257. package/templates/space/apps/fe/src/config/query.config.ts +20 -0
  258. package/templates/space/apps/fe/src/hooks/useAuth.ts +5 -0
  259. package/templates/space/apps/fe/src/main.tsx +52 -0
  260. package/templates/space/apps/fe/src/pages/(guest)/login.tsx +23 -0
  261. package/templates/space/apps/fe/src/pages/(guest)/register.tsx +23 -0
  262. package/templates/space/apps/fe/src/pages/(guest)/route.tsx +18 -0
  263. package/templates/space/apps/fe/src/pages/(private)/index.tsx +23 -0
  264. package/templates/space/apps/fe/src/pages/(private)/planets/$id/edit.tsx +53 -0
  265. package/templates/space/apps/fe/src/pages/(private)/planets/$id/index.tsx +41 -0
  266. package/templates/space/apps/fe/src/pages/(private)/planets/index.tsx +24 -0
  267. package/templates/space/apps/fe/src/pages/(private)/planets-feed.tsx +23 -0
  268. package/templates/space/apps/fe/src/pages/(private)/profile.tsx +23 -0
  269. package/templates/space/apps/fe/src/pages/(private)/route.tsx +18 -0
  270. package/templates/space/apps/fe/src/pages/(public)/auth.tsx +37 -0
  271. package/templates/space/apps/fe/src/pages/(public)/route.tsx +9 -0
  272. package/templates/space/apps/fe/src/pages/__root.tsx +164 -0
  273. package/templates/space/apps/fe/src/providers/AppErrorBoundary.tsx +10 -0
  274. package/templates/space/apps/fe/src/providers/OpenApiRuntimeProvider.tsx +31 -0
  275. package/templates/space/apps/fe/src/providers/index.tsx +44 -0
  276. package/templates/space/apps/fe/src/providers/jwt.provider.tsx +95 -0
  277. package/templates/space/apps/fe/src/routeTree.gen.ts +309 -0
  278. package/templates/space/apps/fe/src/styles/base.css +103 -0
  279. package/templates/space/apps/fe/src/styles/fonts/fonts.tsx +10 -0
  280. package/templates/space/apps/fe/src/styles/fonts/general-sans.css +31 -0
  281. package/templates/space/apps/fe/src/styles/globals.css +28 -0
  282. package/templates/space/apps/fe/src/styles/overrides/defaults/button.override.ts +536 -0
  283. package/templates/space/apps/fe/src/styles/overrides/defaults/checkbox.override.ts +71 -0
  284. package/templates/space/apps/fe/src/styles/overrides/defaults/input.override.ts +252 -0
  285. package/templates/space/apps/fe/src/styles/overrides/defaults/label.override.ts +91 -0
  286. package/templates/space/apps/fe/src/styles/overrides/defaults/modal.override.ts +57 -0
  287. package/templates/space/apps/fe/src/styles/overrides/defaults/radio.override.ts +46 -0
  288. package/templates/space/apps/fe/src/styles/overrides/defaults/table.override.ts +104 -0
  289. package/templates/space/apps/fe/src/styles/overrides/defaults/tag.override.ts +66 -0
  290. package/templates/space/apps/fe/src/styles/overrides/defaults/typography.override.ts +115 -0
  291. package/templates/space/apps/fe/src/styles/overrides/outline.clsx.ts +10 -0
  292. package/templates/space/apps/fe/src/styles/overrides/uiOverrides.override.ts +60 -0
  293. package/templates/space/apps/fe/src/styles/theme.css +2177 -0
  294. package/templates/space/apps/fe/src/types/i18next.d.ts +12 -0
  295. package/templates/space/apps/fe/src/types/table.d.ts +17 -0
  296. package/templates/space/apps/fe/src/types/ui.d.ts +26 -0
  297. package/templates/space/apps/fe/src/types/vite-env.d.ts +20 -0
  298. package/templates/space/apps/fe/src/utils/date.utils.ts +17 -0
  299. package/templates/space/apps/fe/src/utils/image-fallback.ts +9 -0
  300. package/templates/space/apps/fe/src/utils/media-upload.ts +63 -0
  301. package/templates/space/apps/fe/src/utils/number.utils.ts +12 -0
  302. package/templates/space/apps/fe/src/utils/string.utils.ts +5 -0
  303. package/templates/space/apps/fe/src/vite-env.d.ts +1 -0
  304. package/templates/space/apps/fe/tsconfig.app.json +32 -0
  305. package/templates/space/apps/fe/tsconfig.json +9 -0
  306. package/templates/space/apps/fe/tsconfig.node.json +31 -0
  307. package/templates/space/apps/fe/vite.config.ts +94 -0
  308. package/templates/space/database.ts +33 -13
  309. package/templates/space/openapi.json +1819 -0
  310. package/templates/space/oxfmt.config.js +23 -0
  311. package/templates/space/package.json +6 -13
  312. package/templates/space/rulesync.jsonc +18 -0
  313. package/templates/space/tsconfig.json +2 -4
  314. package/templates/auth-chat/index.html +0 -201
  315. package/templates/auth-chat/src/main.tsx +0 -282
  316. package/templates/auth-chat/vite.config.ts +0 -7
  317. package/templates/backend/api/health.ts +0 -7
  318. package/templates/backend/api/launch.ts +0 -29
  319. package/templates/backend/api/me.ts +0 -14
  320. package/templates/backend/api/motto.ts +0 -9
  321. package/templates/backend/api/rockets.ts +0 -43
  322. package/templates/space/api/health.ts +0 -7
  323. package/templates/space/api/launch.ts +0 -29
  324. package/templates/space/api/me.ts +0 -14
  325. package/templates/space/api/motto.ts +0 -9
  326. package/templates/space/api/rockets.ts +0 -43
  327. package/templates/space/index.html +0 -138
  328. package/templates/space/src/main.tsx +0 -229
  329. package/templates/space/vite.config.ts +0 -7
@@ -0,0 +1,1819 @@
1
+ {
2
+ "info": {
3
+ "title": "Tiny Template Fake API",
4
+ "description": "OpenAPI spec for the Tiny Robodev backend and reserved /api/user auth.",
5
+ "version": "3.0.0"
6
+ },
7
+ "servers": [
8
+ {
9
+ "url": "/",
10
+ "description": "Current origin"
11
+ }
12
+ ],
13
+ "openapi": "3.0.3",
14
+ "components": {
15
+ "schemas": {
16
+ "UserMeResponse": {
17
+ "type": "object",
18
+ "properties": {
19
+ "id": {
20
+ "type": "string"
21
+ },
22
+ "name": {
23
+ "nullable": true,
24
+ "type": "string"
25
+ },
26
+ "email": {
27
+ "nullable": true,
28
+ "type": "string",
29
+ "format": "email"
30
+ }
31
+ },
32
+ "required": ["id", "name", "email"]
33
+ },
34
+ "UserMeUpdateRequest": {
35
+ "type": "object",
36
+ "properties": {
37
+ "name": {
38
+ "type": "string"
39
+ },
40
+ "email": {
41
+ "type": "string",
42
+ "minLength": 1,
43
+ "format": "email"
44
+ }
45
+ }
46
+ },
47
+ "UserPushTokensResponse": {
48
+ "type": "array",
49
+ "items": {
50
+ "$ref": "#/components/schemas/UserPushTokensCreateResponse"
51
+ }
52
+ },
53
+ "UserPushTokenCreate": {
54
+ "type": "object",
55
+ "properties": {
56
+ "token": {
57
+ "type": "string",
58
+ "minLength": 1
59
+ },
60
+ "provider": {
61
+ "type": "string",
62
+ "minLength": 1
63
+ },
64
+ "title": {
65
+ "nullable": true,
66
+ "type": "string"
67
+ },
68
+ "expiresAt": {
69
+ "nullable": true,
70
+ "type": "string"
71
+ }
72
+ },
73
+ "required": ["token", "provider"]
74
+ },
75
+ "UserPushTokensCreateResponse": {
76
+ "type": "object",
77
+ "properties": {
78
+ "id": {
79
+ "type": "string"
80
+ },
81
+ "resourceName": {
82
+ "type": "string"
83
+ },
84
+ "resourceLabel": {
85
+ "nullable": true,
86
+ "type": "string"
87
+ },
88
+ "module": {
89
+ "nullable": true,
90
+ "type": "string"
91
+ },
92
+ "resourceId": {
93
+ "nullable": true,
94
+ "type": "string"
95
+ },
96
+ "token": {
97
+ "type": "string"
98
+ },
99
+ "provider": {
100
+ "type": "string"
101
+ },
102
+ "expiresAt": {
103
+ "nullable": true,
104
+ "type": "string"
105
+ },
106
+ "title": {
107
+ "nullable": true,
108
+ "type": "string"
109
+ },
110
+ "createdAt": {
111
+ "type": "string"
112
+ },
113
+ "updatedAt": {
114
+ "type": "string"
115
+ }
116
+ },
117
+ "required": [
118
+ "id",
119
+ "resourceName",
120
+ "resourceLabel",
121
+ "module",
122
+ "resourceId",
123
+ "token",
124
+ "provider",
125
+ "expiresAt",
126
+ "title",
127
+ "createdAt",
128
+ "updatedAt"
129
+ ]
130
+ },
131
+ "UserPushTokenId": {
132
+ "type": "object",
133
+ "properties": {
134
+ "id": {
135
+ "type": "string"
136
+ }
137
+ },
138
+ "required": ["id"]
139
+ },
140
+ "UserPushTokensRemoveResponse": {
141
+ "type": "object",
142
+ "properties": {
143
+ "id": {
144
+ "type": "string"
145
+ },
146
+ "resourceName": {
147
+ "type": "string"
148
+ },
149
+ "resourceLabel": {
150
+ "nullable": true,
151
+ "type": "string"
152
+ },
153
+ "module": {
154
+ "nullable": true,
155
+ "type": "string"
156
+ },
157
+ "resourceId": {
158
+ "nullable": true,
159
+ "type": "string"
160
+ },
161
+ "token": {
162
+ "type": "string"
163
+ },
164
+ "provider": {
165
+ "type": "string"
166
+ },
167
+ "expiresAt": {
168
+ "nullable": true,
169
+ "type": "string"
170
+ },
171
+ "title": {
172
+ "nullable": true,
173
+ "type": "string"
174
+ },
175
+ "createdAt": {
176
+ "type": "string"
177
+ },
178
+ "updatedAt": {
179
+ "type": "string"
180
+ }
181
+ },
182
+ "required": [
183
+ "id",
184
+ "resourceName",
185
+ "resourceLabel",
186
+ "module",
187
+ "resourceId",
188
+ "token",
189
+ "provider",
190
+ "expiresAt",
191
+ "title",
192
+ "createdAt",
193
+ "updatedAt"
194
+ ]
195
+ },
196
+ "UserAuthEmailGenerateRequest": {
197
+ "type": "object",
198
+ "properties": {
199
+ "email": {
200
+ "type": "string",
201
+ "format": "email"
202
+ }
203
+ },
204
+ "required": ["email"]
205
+ },
206
+ "StatusResponse": {
207
+ "type": "object",
208
+ "properties": {
209
+ "status": {
210
+ "type": "string"
211
+ },
212
+ "message": {
213
+ "type": "string"
214
+ },
215
+ "code": {
216
+ "type": "string"
217
+ }
218
+ },
219
+ "required": ["status", "message", "code"]
220
+ },
221
+ "UserAuthMagicConsumeRequest": {
222
+ "type": "object",
223
+ "properties": {
224
+ "code": {
225
+ "type": "string"
226
+ }
227
+ },
228
+ "required": ["code"]
229
+ },
230
+ "AuthnTokenResponse": {
231
+ "type": "object",
232
+ "properties": {
233
+ "accessToken": {
234
+ "type": "string"
235
+ },
236
+ "refreshToken": {
237
+ "type": "string"
238
+ }
239
+ },
240
+ "required": ["accessToken"]
241
+ },
242
+ "UserAuthPasswordLoginRequest": {
243
+ "type": "object",
244
+ "properties": {
245
+ "email": {
246
+ "type": "string",
247
+ "minLength": 1,
248
+ "format": "email"
249
+ },
250
+ "password": {
251
+ "type": "string",
252
+ "minLength": 1
253
+ }
254
+ },
255
+ "required": ["email", "password"]
256
+ },
257
+ "UserAuthPasswordRegisterRequest": {
258
+ "type": "object",
259
+ "properties": {
260
+ "email": {
261
+ "type": "string",
262
+ "minLength": 1,
263
+ "format": "email"
264
+ },
265
+ "password": {
266
+ "type": "string",
267
+ "minLength": 12
268
+ },
269
+ "name": {
270
+ "type": "string"
271
+ }
272
+ },
273
+ "required": ["email", "password"]
274
+ },
275
+ "AuthnTokenRequest": {
276
+ "type": "object",
277
+ "properties": {
278
+ "refreshToken": {
279
+ "type": "string",
280
+ "minLength": 1
281
+ }
282
+ },
283
+ "required": ["refreshToken"]
284
+ },
285
+ "MediaUploadRequest": {
286
+ "type": "object",
287
+ "properties": {
288
+ "resourceName": {
289
+ "$ref": "#/components/schemas/MediaResourceName"
290
+ },
291
+ "fileName": {
292
+ "type": "string",
293
+ "minLength": 1
294
+ },
295
+ "fileSize": {
296
+ "type": "integer",
297
+ "minimum": -9007199254740991,
298
+ "maximum": 9007199254740991,
299
+ "exclusiveMinimum": 0
300
+ },
301
+ "mimeType": {
302
+ "type": "string",
303
+ "minLength": 1
304
+ },
305
+ "method": {
306
+ "$ref": "#/components/schemas/MediaUploadMethod"
307
+ }
308
+ },
309
+ "required": ["fileName", "fileSize"]
310
+ },
311
+ "MediaUploadInstructionsResponse": {
312
+ "type": "object",
313
+ "properties": {
314
+ "id": {
315
+ "type": "string"
316
+ },
317
+ "method": {
318
+ "$ref": "#/components/schemas/MediaUploadMethod"
319
+ },
320
+ "url": {
321
+ "type": "string"
322
+ },
323
+ "fields": {
324
+ "type": "array",
325
+ "items": {
326
+ "type": "array"
327
+ }
328
+ },
329
+ "provider": {
330
+ "type": "string"
331
+ }
332
+ },
333
+ "required": ["id", "method", "url", "fields"]
334
+ },
335
+ "FakeMailSendDemoBody": {
336
+ "type": "object",
337
+ "properties": {
338
+ "variant": {
339
+ "$ref": "#/components/schemas/FakeMailDemoVariant"
340
+ }
341
+ },
342
+ "required": ["variant"]
343
+ },
344
+ "FakeMailSendDemoResponse": {
345
+ "type": "object",
346
+ "properties": {
347
+ "mailIds": {
348
+ "type": "array",
349
+ "minItems": 1,
350
+ "items": {
351
+ "type": "string"
352
+ }
353
+ }
354
+ },
355
+ "required": ["mailIds"]
356
+ },
357
+ "AliensGetLabelsQuery": {
358
+ "type": "object",
359
+ "properties": {
360
+ "search": {
361
+ "type": "string"
362
+ }
363
+ }
364
+ },
365
+ "AliensGetLabelsResponse": {
366
+ "type": "array",
367
+ "items": {
368
+ "$ref": "#/components/schemas/Label"
369
+ }
370
+ },
371
+ "PlanetsGetAllQuery": {
372
+ "type": "object",
373
+ "properties": {
374
+ "filter": {
375
+ "$ref": "#/components/schemas/PlanetPaginateFilterParam"
376
+ },
377
+ "order": {
378
+ "nullable": true,
379
+ "allOf": [
380
+ {
381
+ "$ref": "#/components/schemas/PlanetPaginateOrderParam"
382
+ }
383
+ ]
384
+ }
385
+ }
386
+ },
387
+ "GetAllResponse": {
388
+ "type": "array",
389
+ "items": {
390
+ "$ref": "#/components/schemas/PlanetsGetResponseDto"
391
+ }
392
+ },
393
+ "PlanetsPaginateQuery": {
394
+ "type": "object",
395
+ "properties": {
396
+ "page": {
397
+ "type": "integer",
398
+ "minimum": -9007199254740991,
399
+ "maximum": 9007199254740991,
400
+ "exclusiveMinimum": 0
401
+ },
402
+ "cursor": {
403
+ "nullable": true,
404
+ "allOf": [
405
+ {
406
+ "$ref": "#/components/schemas/paginationCursor"
407
+ }
408
+ ]
409
+ },
410
+ "limit": {
411
+ "type": "number",
412
+ "maximum": 20,
413
+ "exclusiveMinimum": 0,
414
+ "default": 20
415
+ },
416
+ "filter": {
417
+ "$ref": "#/components/schemas/PlanetPaginateFilterParam"
418
+ },
419
+ "order": {
420
+ "nullable": true,
421
+ "allOf": [
422
+ {
423
+ "$ref": "#/components/schemas/PlanetPaginateOrderParam"
424
+ }
425
+ ]
426
+ }
427
+ }
428
+ },
429
+ "PlanetsPaginateItemPaginationResponse": {
430
+ "type": "object",
431
+ "properties": {
432
+ "page": {
433
+ "nullable": true,
434
+ "type": "number"
435
+ },
436
+ "cursor": {
437
+ "nullable": true,
438
+ "type": "string"
439
+ },
440
+ "nextCursor": {
441
+ "nullable": true,
442
+ "type": "string"
443
+ },
444
+ "limit": {
445
+ "type": "number"
446
+ },
447
+ "totalItems": {
448
+ "type": "number"
449
+ },
450
+ "items": {
451
+ "type": "array",
452
+ "items": {
453
+ "$ref": "#/components/schemas/PlanetsPaginateItemDto"
454
+ }
455
+ }
456
+ },
457
+ "required": ["limit", "totalItems", "items"]
458
+ },
459
+ "PlanetsLikeParams": {
460
+ "type": "object",
461
+ "properties": {
462
+ "id": {
463
+ "type": "string"
464
+ }
465
+ },
466
+ "required": ["id"]
467
+ },
468
+ "PlanetsGetResponseDto": {
469
+ "type": "object",
470
+ "properties": {
471
+ "id": {
472
+ "type": "string"
473
+ },
474
+ "userId": {
475
+ "type": "string"
476
+ },
477
+ "alienId": {
478
+ "nullable": true,
479
+ "type": "string"
480
+ },
481
+ "discoveryDate": {
482
+ "nullable": true,
483
+ "type": "string",
484
+ "format": "date-time"
485
+ },
486
+ "name": {
487
+ "type": "string"
488
+ },
489
+ "description": {
490
+ "nullable": true,
491
+ "type": "string"
492
+ },
493
+ "createdAt": {
494
+ "type": "string"
495
+ },
496
+ "updatedAt": {
497
+ "type": "string"
498
+ },
499
+ "image": {
500
+ "nullable": true,
501
+ "allOf": [
502
+ {
503
+ "$ref": "#/components/schemas/PlanetImageDto"
504
+ }
505
+ ]
506
+ },
507
+ "creatorName": {
508
+ "type": "string"
509
+ },
510
+ "alienName": {
511
+ "type": "string"
512
+ },
513
+ "likesCount": {
514
+ "type": "integer",
515
+ "minimum": 0,
516
+ "maximum": 9007199254740991
517
+ },
518
+ "likedByMe": {
519
+ "type": "boolean"
520
+ }
521
+ },
522
+ "required": ["id", "userId", "name", "createdAt", "updatedAt", "likesCount", "likedByMe"]
523
+ },
524
+ "PlanetsCreateRequestDto": {
525
+ "type": "object",
526
+ "properties": {
527
+ "name": {
528
+ "type": "string",
529
+ "minLength": 1
530
+ },
531
+ "alienId": {
532
+ "nullable": true,
533
+ "type": "string"
534
+ },
535
+ "discoveryDate": {
536
+ "nullable": true,
537
+ "type": "string",
538
+ "format": "date-time"
539
+ },
540
+ "description": {
541
+ "nullable": true,
542
+ "type": "string"
543
+ },
544
+ "image": {
545
+ "nullable": true,
546
+ "allOf": [
547
+ {
548
+ "$ref": "#/components/schemas/PlanetImageRequestDto"
549
+ }
550
+ ]
551
+ }
552
+ },
553
+ "required": ["name"]
554
+ },
555
+ "PlanetControllerUpdateRequestDto": {
556
+ "type": "object",
557
+ "properties": {
558
+ "name": {
559
+ "type": "string",
560
+ "minLength": 1
561
+ },
562
+ "alienId": {
563
+ "nullable": true,
564
+ "type": "string"
565
+ },
566
+ "discoveryDate": {
567
+ "nullable": true,
568
+ "type": "string",
569
+ "format": "date-time"
570
+ },
571
+ "description": {
572
+ "nullable": true,
573
+ "type": "string"
574
+ },
575
+ "image": {
576
+ "nullable": true,
577
+ "allOf": [
578
+ {
579
+ "$ref": "#/components/schemas/PlanetImageRequestDto"
580
+ }
581
+ ]
582
+ }
583
+ },
584
+ "required": ["name"]
585
+ },
586
+ "DateRange": {
587
+ "type": "object",
588
+ "properties": {
589
+ "start": {
590
+ "nullable": true,
591
+ "type": "string",
592
+ "format": "date-time"
593
+ },
594
+ "end": {
595
+ "nullable": true,
596
+ "type": "string",
597
+ "format": "date-time"
598
+ }
599
+ }
600
+ },
601
+ "Label": {
602
+ "type": "object",
603
+ "properties": {
604
+ "id": {
605
+ "type": "string"
606
+ },
607
+ "label": {
608
+ "type": "string"
609
+ }
610
+ },
611
+ "required": ["id", "label"]
612
+ },
613
+ "PaginationDto": {
614
+ "type": "object",
615
+ "properties": {
616
+ "page": {
617
+ "nullable": true,
618
+ "type": "number"
619
+ },
620
+ "cursor": {
621
+ "nullable": true,
622
+ "type": "string"
623
+ },
624
+ "nextCursor": {
625
+ "nullable": true,
626
+ "type": "string"
627
+ },
628
+ "limit": {
629
+ "type": "number"
630
+ },
631
+ "totalItems": {
632
+ "type": "number"
633
+ }
634
+ },
635
+ "required": ["limit", "totalItems"]
636
+ },
637
+ "PaginationQuery": {
638
+ "type": "object",
639
+ "properties": {
640
+ "page": {
641
+ "type": "integer",
642
+ "minimum": -9007199254740991,
643
+ "maximum": 9007199254740991,
644
+ "exclusiveMinimum": 0
645
+ },
646
+ "cursor": {
647
+ "nullable": true,
648
+ "allOf": [
649
+ {
650
+ "$ref": "#/components/schemas/paginationCursor"
651
+ }
652
+ ]
653
+ },
654
+ "limit": {
655
+ "type": "number",
656
+ "maximum": 20,
657
+ "exclusiveMinimum": 0,
658
+ "default": 20
659
+ }
660
+ }
661
+ },
662
+ "paginationCursor": {
663
+ "type": "string",
664
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*(?::.+)?$"
665
+ },
666
+ "PlanetPaginateOrderParamEnum": {
667
+ "enum": ["id", "name", "discoveryDate", "createdAt", "updatedAt"],
668
+ "type": "string",
669
+ "x-enumNames": ["id", "name", "discoveryDate", "createdAt", "updatedAt"]
670
+ },
671
+ "MediaResourceName": {
672
+ "type": "string",
673
+ "minLength": 1,
674
+ "enum": ["small-image", "large-image", "compressed-file", "document", "any", "planet-image"]
675
+ },
676
+ "MediaUploadMethod": {
677
+ "type": "string",
678
+ "minLength": 1
679
+ },
680
+ "FakeMailDemoVariant": {
681
+ "enum": ["text", "html", "recipients", "sequence"],
682
+ "type": "string",
683
+ "x-enumNames": ["text", "html", "recipients", "sequence"]
684
+ },
685
+ "PlanetPaginateFilterParam": {
686
+ "nullable": true,
687
+ "type": "object",
688
+ "properties": {
689
+ "search": {
690
+ "type": "string"
691
+ },
692
+ "alienId": {
693
+ "nullable": true,
694
+ "type": "string"
695
+ },
696
+ "discoveryDate": {
697
+ "nullable": true,
698
+ "allOf": [
699
+ {
700
+ "$ref": "#/components/schemas/DateRange"
701
+ }
702
+ ]
703
+ }
704
+ }
705
+ },
706
+ "PlanetPaginateOrderParam": {
707
+ "nullable": true,
708
+ "type": "string"
709
+ },
710
+ "PlanetImageDto": {
711
+ "type": "object",
712
+ "properties": {
713
+ "id": {
714
+ "type": "string"
715
+ },
716
+ "url": {
717
+ "type": "string"
718
+ }
719
+ },
720
+ "required": ["id", "url"]
721
+ },
722
+ "PlanetsPaginateItemDto": {
723
+ "type": "object",
724
+ "properties": {
725
+ "id": {
726
+ "type": "string"
727
+ },
728
+ "userId": {
729
+ "type": "string"
730
+ },
731
+ "alienId": {
732
+ "nullable": true,
733
+ "type": "string"
734
+ },
735
+ "discoveryDate": {
736
+ "nullable": true,
737
+ "type": "string",
738
+ "format": "date-time"
739
+ },
740
+ "name": {
741
+ "type": "string"
742
+ },
743
+ "description": {
744
+ "nullable": true,
745
+ "type": "string"
746
+ },
747
+ "createdAt": {
748
+ "type": "string"
749
+ },
750
+ "updatedAt": {
751
+ "type": "string"
752
+ },
753
+ "image": {
754
+ "nullable": true,
755
+ "allOf": [
756
+ {
757
+ "$ref": "#/components/schemas/PlanetImageDto"
758
+ }
759
+ ]
760
+ },
761
+ "creatorName": {
762
+ "type": "string"
763
+ },
764
+ "alienName": {
765
+ "type": "string"
766
+ },
767
+ "likesCount": {
768
+ "type": "integer",
769
+ "minimum": 0,
770
+ "maximum": 9007199254740991
771
+ },
772
+ "likedByMe": {
773
+ "type": "boolean"
774
+ }
775
+ },
776
+ "required": ["id", "userId", "name", "createdAt", "updatedAt", "likesCount", "likedByMe"]
777
+ },
778
+ "PlanetImageRequestDto": {
779
+ "type": "object",
780
+ "properties": {
781
+ "id": {
782
+ "type": "string"
783
+ }
784
+ },
785
+ "required": ["id"]
786
+ }
787
+ },
788
+ "securitySchemes": {
789
+ "bearerAuth": {
790
+ "type": "http",
791
+ "scheme": "bearer"
792
+ }
793
+ }
794
+ },
795
+ "paths": {
796
+ "/api/user/me": {
797
+ "get": {
798
+ "operationId": "UserMeController_get",
799
+ "tags": ["User"],
800
+ "responses": {
801
+ "200": {
802
+ "description": "OK",
803
+ "content": {
804
+ "application/json": {
805
+ "schema": {
806
+ "$ref": "#/components/schemas/UserMeResponse"
807
+ }
808
+ }
809
+ }
810
+ },
811
+ "401": {
812
+ "description": "Unauthorized"
813
+ },
814
+ "403": {
815
+ "description": "Forbidden"
816
+ }
817
+ },
818
+ "security": [
819
+ {
820
+ "bearerAuth": []
821
+ }
822
+ ],
823
+ "x-bl": "Returns the authenticated user's profile for a valid access token.",
824
+ "x-acl": [
825
+ {
826
+ "action": "read",
827
+ "subject": "User"
828
+ }
829
+ ]
830
+ },
831
+ "put": {
832
+ "operationId": "UserMeController_update",
833
+ "tags": ["User"],
834
+ "requestBody": {
835
+ "required": true,
836
+ "content": {
837
+ "application/json": {
838
+ "schema": {
839
+ "$ref": "#/components/schemas/UserMeUpdateRequest"
840
+ }
841
+ }
842
+ }
843
+ },
844
+ "responses": {
845
+ "200": {
846
+ "description": "OK",
847
+ "content": {
848
+ "application/json": {
849
+ "schema": {
850
+ "$ref": "#/components/schemas/UserMeResponse"
851
+ }
852
+ }
853
+ }
854
+ },
855
+ "401": {
856
+ "description": "Unauthorized"
857
+ },
858
+ "403": {
859
+ "description": "Forbidden"
860
+ }
861
+ },
862
+ "security": [
863
+ {
864
+ "bearerAuth": []
865
+ }
866
+ ],
867
+ "x-bl": "Updates the authenticated user's own name and email, enforcing unique email ownership, and returns the updated profile.",
868
+ "x-acl": [
869
+ {
870
+ "action": "update",
871
+ "subject": "User"
872
+ }
873
+ ]
874
+ }
875
+ },
876
+ "/api/user/push-tokens": {
877
+ "get": {
878
+ "operationId": "UserMePushTokensController_list",
879
+ "tags": ["User"],
880
+ "responses": {
881
+ "200": {
882
+ "description": "OK",
883
+ "content": {
884
+ "application/json": {
885
+ "schema": {
886
+ "$ref": "#/components/schemas/UserPushTokensResponse"
887
+ }
888
+ }
889
+ }
890
+ }
891
+ },
892
+ "security": [
893
+ {
894
+ "bearerAuth": []
895
+ }
896
+ ],
897
+ "x-bl": "Lists push notification tokens owned by the authenticated user."
898
+ },
899
+ "post": {
900
+ "operationId": "UserMePushTokensController_create",
901
+ "tags": ["User"],
902
+ "requestBody": {
903
+ "required": true,
904
+ "content": {
905
+ "application/json": {
906
+ "schema": {
907
+ "$ref": "#/components/schemas/UserPushTokenCreate"
908
+ }
909
+ }
910
+ }
911
+ },
912
+ "responses": {
913
+ "201": {
914
+ "description": "OK",
915
+ "content": {
916
+ "application/json": {
917
+ "schema": {
918
+ "$ref": "#/components/schemas/UserPushTokensCreateResponse"
919
+ }
920
+ }
921
+ }
922
+ }
923
+ },
924
+ "security": [
925
+ {
926
+ "bearerAuth": []
927
+ }
928
+ ],
929
+ "x-bl": "Registers or refreshes a push notification token for the authenticated user."
930
+ }
931
+ },
932
+ "/api/user/push-tokens/{id}": {
933
+ "delete": {
934
+ "operationId": "UserMePushTokensController_remove",
935
+ "tags": ["User"],
936
+ "parameters": [
937
+ {
938
+ "name": "id",
939
+ "in": "path",
940
+ "required": true,
941
+ "schema": {
942
+ "type": "string"
943
+ }
944
+ }
945
+ ],
946
+ "responses": {
947
+ "200": {
948
+ "description": "OK",
949
+ "content": {
950
+ "application/json": {
951
+ "schema": {
952
+ "$ref": "#/components/schemas/UserPushTokensCreateResponse"
953
+ }
954
+ }
955
+ }
956
+ }
957
+ },
958
+ "security": [
959
+ {
960
+ "bearerAuth": []
961
+ }
962
+ ],
963
+ "x-bl": "Deletes a push notification token only when owned by the authenticated user."
964
+ }
965
+ },
966
+ "/api/user/auth/magic-link": {
967
+ "get": {
968
+ "operationId": "UserAuthMagicLinkController_generate",
969
+ "tags": ["User Auth"],
970
+ "parameters": [
971
+ {
972
+ "name": "email",
973
+ "in": "query",
974
+ "required": true,
975
+ "schema": {
976
+ "type": "string",
977
+ "format": "email"
978
+ },
979
+ "allowEmptyValue": true,
980
+ "allowReserved": true
981
+ }
982
+ ],
983
+ "responses": {
984
+ "200": {
985
+ "description": "OK",
986
+ "content": {
987
+ "application/json": {
988
+ "schema": {
989
+ "$ref": "#/components/schemas/StatusResponse"
990
+ }
991
+ }
992
+ }
993
+ }
994
+ },
995
+ "x-bl": "For an existing local user, creates a short-lived single-use magic login code and emails a callback link containing type=magic and the code. Returns the same generic success message regardless of whether an identity exists to prevent account enumeration."
996
+ }
997
+ },
998
+ "/api/user/auth/magic-link/callback": {
999
+ "get": {
1000
+ "operationId": "UserAuthMagicLinkController_consume",
1001
+ "tags": ["User Auth"],
1002
+ "parameters": [
1003
+ {
1004
+ "name": "code",
1005
+ "in": "query",
1006
+ "required": true,
1007
+ "schema": {
1008
+ "type": "string"
1009
+ },
1010
+ "allowEmptyValue": true,
1011
+ "allowReserved": true
1012
+ }
1013
+ ],
1014
+ "responses": {
1015
+ "200": {
1016
+ "description": "OK",
1017
+ "content": {
1018
+ "application/json": {
1019
+ "schema": {
1020
+ "$ref": "#/components/schemas/AuthnTokenResponse"
1021
+ }
1022
+ }
1023
+ }
1024
+ }
1025
+ },
1026
+ "x-bl": "Consumes a valid, unexpired, previously unused magic login code for an existing local user, permanently marks the code used, and returns access and refresh tokens. Rejects invalid, expired, or reused codes."
1027
+ }
1028
+ },
1029
+ "/api/user/auth/login": {
1030
+ "post": {
1031
+ "operationId": "UserAuthLocalPasswordController_login",
1032
+ "tags": ["User Auth"],
1033
+ "requestBody": {
1034
+ "required": true,
1035
+ "content": {
1036
+ "application/json": {
1037
+ "schema": {
1038
+ "$ref": "#/components/schemas/UserAuthPasswordLoginRequest"
1039
+ }
1040
+ }
1041
+ }
1042
+ },
1043
+ "responses": {
1044
+ "200": {
1045
+ "description": "OK",
1046
+ "content": {
1047
+ "application/json": {
1048
+ "schema": {
1049
+ "$ref": "#/components/schemas/AuthnTokenResponse"
1050
+ }
1051
+ }
1052
+ }
1053
+ }
1054
+ },
1055
+ "x-bl": "Validates local user credentials and returns access and refresh tokens for authenticated API requests."
1056
+ }
1057
+ },
1058
+ "/api/user/auth/register": {
1059
+ "post": {
1060
+ "operationId": "UserAuthLocalPasswordController_register",
1061
+ "tags": ["User Auth"],
1062
+ "requestBody": {
1063
+ "required": true,
1064
+ "content": {
1065
+ "application/json": {
1066
+ "schema": {
1067
+ "$ref": "#/components/schemas/UserAuthPasswordRegisterRequest"
1068
+ }
1069
+ }
1070
+ }
1071
+ },
1072
+ "responses": {
1073
+ "201": {
1074
+ "description": "OK",
1075
+ "content": {
1076
+ "application/json": {
1077
+ "schema": {
1078
+ "$ref": "#/components/schemas/AuthnTokenResponse"
1079
+ }
1080
+ }
1081
+ }
1082
+ }
1083
+ },
1084
+ "x-bl": "Validates registration input, enforces unique email, creates a local user, sends a welcome email to the registered address, and returns access and refresh tokens."
1085
+ }
1086
+ },
1087
+ "/api/user/auth/refresh": {
1088
+ "post": {
1089
+ "operationId": "UserAuthJwtController_accessToken",
1090
+ "tags": ["User Auth"],
1091
+ "requestBody": {
1092
+ "required": true,
1093
+ "content": {
1094
+ "application/json": {
1095
+ "schema": {
1096
+ "$ref": "#/components/schemas/AuthnTokenRequest"
1097
+ }
1098
+ }
1099
+ }
1100
+ },
1101
+ "responses": {
1102
+ "200": {
1103
+ "description": "OK",
1104
+ "content": {
1105
+ "application/json": {
1106
+ "schema": {
1107
+ "$ref": "#/components/schemas/AuthnTokenResponse"
1108
+ }
1109
+ }
1110
+ }
1111
+ }
1112
+ },
1113
+ "x-bl": "Validates a refresh token for an existing user and returns a new access and refresh token pair."
1114
+ }
1115
+ },
1116
+ "/api/user/auth/google/callback": {
1117
+ "get": {
1118
+ "operationId": "UserAuthGoogleController_login",
1119
+ "tags": ["User Auth"],
1120
+ "responses": {
1121
+ "200": {
1122
+ "description": "OK",
1123
+ "content": {
1124
+ "application/json": {
1125
+ "schema": {
1126
+ "$ref": "#/components/schemas/AuthnTokenResponse"
1127
+ }
1128
+ }
1129
+ }
1130
+ }
1131
+ },
1132
+ "x-bl": "Completes Google authentication and returns access and refresh tokens."
1133
+ }
1134
+ },
1135
+ "/api/user/auth/apple/callback": {
1136
+ "get": {
1137
+ "operationId": "UserAuthAppleController_login",
1138
+ "tags": ["User Auth"],
1139
+ "responses": {
1140
+ "200": {
1141
+ "description": "OK",
1142
+ "content": {
1143
+ "application/json": {
1144
+ "schema": {
1145
+ "$ref": "#/components/schemas/AuthnTokenResponse"
1146
+ }
1147
+ }
1148
+ }
1149
+ }
1150
+ },
1151
+ "x-bl": "Completes deterministic fake Apple authentication and returns access and refresh tokens."
1152
+ }
1153
+ },
1154
+ "/api/user/auth/forgot-password": {
1155
+ "post": {
1156
+ "operationId": "UserAuthForgotPasswordController_requestReset",
1157
+ "tags": ["User Auth"],
1158
+ "requestBody": {
1159
+ "required": true,
1160
+ "content": {
1161
+ "application/json": {
1162
+ "schema": {
1163
+ "$ref": "#/components/schemas/UserAuthEmailGenerateRequest"
1164
+ }
1165
+ }
1166
+ }
1167
+ },
1168
+ "responses": {
1169
+ "200": {
1170
+ "description": "OK",
1171
+ "content": {
1172
+ "application/json": {
1173
+ "schema": {
1174
+ "$ref": "#/components/schemas/StatusResponse"
1175
+ }
1176
+ }
1177
+ }
1178
+ }
1179
+ },
1180
+ "x-bl": "For an existing user, creates a short-lived password reset code and emails it while preventing account enumeration."
1181
+ }
1182
+ },
1183
+ "/api/user/auth/forgot-password/callback": {
1184
+ "post": {
1185
+ "operationId": "UserAuthForgotPasswordController_consumeReset",
1186
+ "tags": ["User Auth"],
1187
+ "requestBody": {
1188
+ "required": true,
1189
+ "content": {
1190
+ "application/json": {
1191
+ "schema": {
1192
+ "$ref": "#/components/schemas/UserAuthMagicConsumeRequest"
1193
+ }
1194
+ }
1195
+ }
1196
+ },
1197
+ "responses": {
1198
+ "200": {
1199
+ "description": "OK",
1200
+ "content": {
1201
+ "application/json": {
1202
+ "schema": {
1203
+ "$ref": "#/components/schemas/StatusResponse"
1204
+ }
1205
+ }
1206
+ }
1207
+ }
1208
+ },
1209
+ "x-bl": "Consumes a valid unused password reset code."
1210
+ }
1211
+ },
1212
+ "/api/files/presigned-url": {
1213
+ "post": {
1214
+ "operationId": "MediaLibraryController_uploadRequest",
1215
+ "tags": ["Media"],
1216
+ "requestBody": {
1217
+ "required": true,
1218
+ "content": {
1219
+ "application/json": {
1220
+ "schema": {
1221
+ "$ref": "#/components/schemas/MediaUploadRequest"
1222
+ }
1223
+ }
1224
+ }
1225
+ },
1226
+ "responses": {
1227
+ "201": {
1228
+ "description": "OK",
1229
+ "content": {
1230
+ "application/json": {
1231
+ "schema": {
1232
+ "$ref": "#/components/schemas/MediaUploadInstructionsResponse"
1233
+ }
1234
+ }
1235
+ }
1236
+ }
1237
+ },
1238
+ "security": [
1239
+ {
1240
+ "bearerAuth": []
1241
+ }
1242
+ ],
1243
+ "x-media-upload": true,
1244
+ "x-bl": "Validates an authenticated media upload request, creates a pending media record for an allowed resource, and returns upload instructions for sending the file bytes separately."
1245
+ }
1246
+ },
1247
+ "/api/fake-mail/demo": {
1248
+ "post": {
1249
+ "operationId": "FakeMailController_sendDemo",
1250
+ "tags": ["Fake Mail"],
1251
+ "requestBody": {
1252
+ "required": true,
1253
+ "content": {
1254
+ "application/json": {
1255
+ "schema": {
1256
+ "$ref": "#/components/schemas/FakeMailSendDemoBody"
1257
+ }
1258
+ }
1259
+ }
1260
+ },
1261
+ "responses": {
1262
+ "201": {
1263
+ "description": "OK",
1264
+ "content": {
1265
+ "application/json": {
1266
+ "schema": {
1267
+ "$ref": "#/components/schemas/FakeMailSendDemoResponse"
1268
+ }
1269
+ }
1270
+ }
1271
+ }
1272
+ },
1273
+ "x-bl": "Creates demonstration email messages for the local fake-mailbox showcase."
1274
+ }
1275
+ },
1276
+ "/api/aliens/labels": {
1277
+ "get": {
1278
+ "operationId": "AlienController_getLabels",
1279
+ "tags": ["Alien"],
1280
+ "parameters": [
1281
+ {
1282
+ "name": "search",
1283
+ "in": "query",
1284
+ "schema": {
1285
+ "type": "string"
1286
+ },
1287
+ "allowEmptyValue": true,
1288
+ "allowReserved": true
1289
+ }
1290
+ ],
1291
+ "responses": {
1292
+ "200": {
1293
+ "description": "OK",
1294
+ "content": {
1295
+ "application/json": {
1296
+ "schema": {
1297
+ "$ref": "#/components/schemas/AliensGetLabelsResponse"
1298
+ }
1299
+ }
1300
+ }
1301
+ },
1302
+ "401": {
1303
+ "description": "Unauthorized"
1304
+ },
1305
+ "403": {
1306
+ "description": "Forbidden"
1307
+ }
1308
+ },
1309
+ "security": [
1310
+ {
1311
+ "bearerAuth": []
1312
+ }
1313
+ ],
1314
+ "x-bl": "Lists up to 50 alien labels matching the optional search term by name, sorted by label.",
1315
+ "x-acl": [
1316
+ {
1317
+ "action": "list",
1318
+ "subject": "Alien"
1319
+ }
1320
+ ]
1321
+ }
1322
+ },
1323
+ "/api/planets": {
1324
+ "get": {
1325
+ "operationId": "PlanetController_getAll",
1326
+ "tags": ["Planet"],
1327
+ "parameters": [
1328
+ {
1329
+ "name": "filter",
1330
+ "in": "query",
1331
+ "required": false,
1332
+ "schema": {
1333
+ "$ref": "#/components/schemas/PlanetPaginateFilterParam"
1334
+ },
1335
+ "style": "deepObject",
1336
+ "explode": true,
1337
+ "allowEmptyValue": true,
1338
+ "allowReserved": true
1339
+ },
1340
+ {
1341
+ "name": "order",
1342
+ "in": "query",
1343
+ "schema": {
1344
+ "nullable": true,
1345
+ "allOf": [
1346
+ {
1347
+ "$ref": "#/components/schemas/PlanetPaginateOrderParam"
1348
+ }
1349
+ ]
1350
+ },
1351
+ "style": "deepObject",
1352
+ "explode": true,
1353
+ "allowEmptyValue": true,
1354
+ "allowReserved": true
1355
+ }
1356
+ ],
1357
+ "responses": {
1358
+ "200": {
1359
+ "description": "OK",
1360
+ "content": {
1361
+ "application/json": {
1362
+ "schema": {
1363
+ "$ref": "#/components/schemas/GetAllResponse"
1364
+ }
1365
+ }
1366
+ }
1367
+ },
1368
+ "401": {
1369
+ "description": "Unauthorized"
1370
+ },
1371
+ "403": {
1372
+ "description": "Forbidden"
1373
+ }
1374
+ },
1375
+ "security": [
1376
+ {
1377
+ "bearerAuth": []
1378
+ }
1379
+ ],
1380
+ "x-bl": "Lists planets, optionally searches by planet name, description, creator name, or alien name and filters by alien and discovery date range, sorts by the requested order with name as the default, and enriches each planet with creator name and alien name.",
1381
+ "x-acl": [
1382
+ {
1383
+ "action": "list",
1384
+ "subject": "Planet"
1385
+ }
1386
+ ]
1387
+ },
1388
+ "post": {
1389
+ "operationId": "PlanetController_create",
1390
+ "tags": ["Planet"],
1391
+ "requestBody": {
1392
+ "required": true,
1393
+ "content": {
1394
+ "application/json": {
1395
+ "schema": {
1396
+ "$ref": "#/components/schemas/PlanetsCreateRequestDto"
1397
+ }
1398
+ }
1399
+ }
1400
+ },
1401
+ "responses": {
1402
+ "201": {
1403
+ "description": "OK",
1404
+ "content": {
1405
+ "application/json": {
1406
+ "schema": {
1407
+ "$ref": "#/components/schemas/PlanetsGetResponseDto"
1408
+ }
1409
+ }
1410
+ }
1411
+ },
1412
+ "401": {
1413
+ "description": "Unauthorized"
1414
+ },
1415
+ "403": {
1416
+ "description": "Forbidden"
1417
+ }
1418
+ },
1419
+ "security": [
1420
+ {
1421
+ "bearerAuth": []
1422
+ }
1423
+ ],
1424
+ "x-bl": "Creates a planet owned by the authenticated user and optionally assigns an existing alien.",
1425
+ "x-acl": [
1426
+ {
1427
+ "action": "create",
1428
+ "subject": "Planet"
1429
+ }
1430
+ ]
1431
+ }
1432
+ },
1433
+ "/api/planets/paginate": {
1434
+ "get": {
1435
+ "operationId": "PlanetController_paginate",
1436
+ "tags": ["Planet"],
1437
+ "parameters": [
1438
+ {
1439
+ "name": "page",
1440
+ "in": "query",
1441
+ "schema": {
1442
+ "type": "integer",
1443
+ "minimum": -9007199254740991,
1444
+ "maximum": 9007199254740991,
1445
+ "exclusiveMinimum": 0
1446
+ },
1447
+ "allowEmptyValue": true,
1448
+ "allowReserved": true
1449
+ },
1450
+ {
1451
+ "name": "cursor",
1452
+ "in": "query",
1453
+ "schema": {
1454
+ "nullable": true,
1455
+ "allOf": [
1456
+ {
1457
+ "$ref": "#/components/schemas/paginationCursor"
1458
+ }
1459
+ ]
1460
+ },
1461
+ "style": "deepObject",
1462
+ "explode": true,
1463
+ "allowEmptyValue": true,
1464
+ "allowReserved": true
1465
+ },
1466
+ {
1467
+ "name": "limit",
1468
+ "in": "query",
1469
+ "schema": {
1470
+ "type": "number",
1471
+ "maximum": 20,
1472
+ "exclusiveMinimum": 0,
1473
+ "default": 20
1474
+ },
1475
+ "allowEmptyValue": true,
1476
+ "allowReserved": true
1477
+ },
1478
+ {
1479
+ "name": "filter",
1480
+ "in": "query",
1481
+ "required": false,
1482
+ "schema": {
1483
+ "$ref": "#/components/schemas/PlanetPaginateFilterParam"
1484
+ },
1485
+ "style": "deepObject",
1486
+ "explode": true,
1487
+ "allowEmptyValue": true,
1488
+ "allowReserved": true
1489
+ },
1490
+ {
1491
+ "name": "order",
1492
+ "in": "query",
1493
+ "schema": {
1494
+ "nullable": true,
1495
+ "allOf": [
1496
+ {
1497
+ "$ref": "#/components/schemas/PlanetPaginateOrderParam"
1498
+ }
1499
+ ]
1500
+ },
1501
+ "style": "deepObject",
1502
+ "explode": true,
1503
+ "allowEmptyValue": true,
1504
+ "allowReserved": true
1505
+ }
1506
+ ],
1507
+ "responses": {
1508
+ "200": {
1509
+ "description": "OK",
1510
+ "content": {
1511
+ "application/json": {
1512
+ "schema": {
1513
+ "$ref": "#/components/schemas/PlanetsPaginateItemPaginationResponse"
1514
+ }
1515
+ }
1516
+ }
1517
+ },
1518
+ "401": {
1519
+ "description": "Unauthorized"
1520
+ },
1521
+ "403": {
1522
+ "description": "Forbidden"
1523
+ }
1524
+ },
1525
+ "security": [
1526
+ {
1527
+ "bearerAuth": []
1528
+ }
1529
+ ],
1530
+ "x-bl": "Lists planets in page-based slices, optionally searches by planet name, description, creator name, or alien name and filters by alien and discovery date range before pagination, sorts by the requested order with name as the default, enriches each planet with creator name and alien name, and returns pagination metadata for incremental loading.",
1531
+ "x-acl": [
1532
+ {
1533
+ "action": "list",
1534
+ "subject": "Planet"
1535
+ }
1536
+ ]
1537
+ }
1538
+ },
1539
+ "/api/planets/{id}": {
1540
+ "get": {
1541
+ "operationId": "PlanetController_getById",
1542
+ "tags": ["Planet"],
1543
+ "parameters": [
1544
+ {
1545
+ "name": "id",
1546
+ "in": "path",
1547
+ "required": true,
1548
+ "schema": {
1549
+ "type": "string"
1550
+ }
1551
+ }
1552
+ ],
1553
+ "responses": {
1554
+ "200": {
1555
+ "description": "OK",
1556
+ "content": {
1557
+ "application/json": {
1558
+ "schema": {
1559
+ "$ref": "#/components/schemas/PlanetsGetResponseDto"
1560
+ }
1561
+ }
1562
+ }
1563
+ },
1564
+ "401": {
1565
+ "description": "Unauthorized"
1566
+ },
1567
+ "403": {
1568
+ "description": "Forbidden"
1569
+ }
1570
+ },
1571
+ "security": [
1572
+ {
1573
+ "bearerAuth": []
1574
+ }
1575
+ ],
1576
+ "x-bl": "Finds one planet by ID and enriches it with creator name and alien name, returning not found when it does not exist.",
1577
+ "x-acl": [
1578
+ {
1579
+ "action": "read",
1580
+ "subject": "Planet"
1581
+ }
1582
+ ]
1583
+ },
1584
+ "put": {
1585
+ "operationId": "PlanetController_update",
1586
+ "tags": ["Planet"],
1587
+ "parameters": [
1588
+ {
1589
+ "name": "id",
1590
+ "in": "path",
1591
+ "required": true,
1592
+ "schema": {
1593
+ "type": "string"
1594
+ }
1595
+ }
1596
+ ],
1597
+ "requestBody": {
1598
+ "required": true,
1599
+ "content": {
1600
+ "application/json": {
1601
+ "schema": {
1602
+ "$ref": "#/components/schemas/PlanetControllerUpdateRequestDto"
1603
+ }
1604
+ }
1605
+ }
1606
+ },
1607
+ "responses": {
1608
+ "200": {
1609
+ "description": "OK",
1610
+ "content": {
1611
+ "application/json": {
1612
+ "schema": {
1613
+ "$ref": "#/components/schemas/PlanetsGetResponseDto"
1614
+ }
1615
+ }
1616
+ }
1617
+ },
1618
+ "401": {
1619
+ "description": "Unauthorized"
1620
+ },
1621
+ "403": {
1622
+ "description": "Forbidden"
1623
+ }
1624
+ },
1625
+ "security": [
1626
+ {
1627
+ "bearerAuth": []
1628
+ }
1629
+ ],
1630
+ "x-bl": "Updates a planet only when the authenticated user owns it, optionally assigns an existing alien, and returns it with creator name and alien name.",
1631
+ "x-acl": [
1632
+ {
1633
+ "action": "update",
1634
+ "subject": "Planet"
1635
+ }
1636
+ ]
1637
+ },
1638
+ "delete": {
1639
+ "operationId": "PlanetController_delete",
1640
+ "tags": ["Planet"],
1641
+ "parameters": [
1642
+ {
1643
+ "name": "id",
1644
+ "in": "path",
1645
+ "required": true,
1646
+ "schema": {
1647
+ "type": "string"
1648
+ }
1649
+ }
1650
+ ],
1651
+ "responses": {
1652
+ "204": {
1653
+ "description": "OK"
1654
+ },
1655
+ "401": {
1656
+ "description": "Unauthorized"
1657
+ },
1658
+ "403": {
1659
+ "description": "Forbidden"
1660
+ }
1661
+ },
1662
+ "security": [
1663
+ {
1664
+ "bearerAuth": []
1665
+ }
1666
+ ],
1667
+ "x-bl": "Deletes a planet only when the authenticated user owns it.",
1668
+ "x-acl": [
1669
+ {
1670
+ "action": "delete",
1671
+ "subject": "Planet"
1672
+ }
1673
+ ]
1674
+ }
1675
+ },
1676
+ "/api/planets/{id}/like": {
1677
+ "post": {
1678
+ "operationId": "PlanetController_like",
1679
+ "tags": ["Planet"],
1680
+ "parameters": [
1681
+ {
1682
+ "name": "id",
1683
+ "in": "path",
1684
+ "required": true,
1685
+ "schema": {
1686
+ "type": "string"
1687
+ }
1688
+ }
1689
+ ],
1690
+ "responses": {
1691
+ "200": {
1692
+ "description": "OK",
1693
+ "content": {
1694
+ "application/json": {
1695
+ "schema": {
1696
+ "$ref": "#/components/schemas/PlanetsGetResponseDto"
1697
+ }
1698
+ }
1699
+ }
1700
+ },
1701
+ "401": {
1702
+ "description": "Unauthorized"
1703
+ },
1704
+ "403": {
1705
+ "description": "Forbidden"
1706
+ }
1707
+ },
1708
+ "security": [
1709
+ {
1710
+ "bearerAuth": []
1711
+ }
1712
+ ],
1713
+ "x-bl": "Likes a planet for the authenticated user and returns the enriched planet with like metadata.",
1714
+ "x-acl": [
1715
+ {
1716
+ "action": "like",
1717
+ "subject": "Planet"
1718
+ }
1719
+ ]
1720
+ },
1721
+ "delete": {
1722
+ "operationId": "PlanetController_unlike",
1723
+ "tags": ["Planet"],
1724
+ "parameters": [
1725
+ {
1726
+ "name": "id",
1727
+ "in": "path",
1728
+ "required": true,
1729
+ "schema": {
1730
+ "type": "string"
1731
+ }
1732
+ }
1733
+ ],
1734
+ "responses": {
1735
+ "200": {
1736
+ "description": "OK",
1737
+ "content": {
1738
+ "application/json": {
1739
+ "schema": {
1740
+ "$ref": "#/components/schemas/PlanetsGetResponseDto"
1741
+ }
1742
+ }
1743
+ }
1744
+ },
1745
+ "401": {
1746
+ "description": "Unauthorized"
1747
+ },
1748
+ "403": {
1749
+ "description": "Forbidden"
1750
+ }
1751
+ },
1752
+ "security": [
1753
+ {
1754
+ "bearerAuth": []
1755
+ }
1756
+ ],
1757
+ "x-bl": "Removes the authenticated user's like from a planet and returns the enriched planet with like metadata.",
1758
+ "x-acl": [
1759
+ {
1760
+ "action": "like",
1761
+ "subject": "Planet"
1762
+ }
1763
+ ]
1764
+ }
1765
+ }
1766
+ },
1767
+ "tags": [
1768
+ {
1769
+ "name": "common",
1770
+ "x-robodev-hidden": true
1771
+ },
1772
+ {
1773
+ "name": "User",
1774
+ "x-robodev-hidden": true,
1775
+ "x-robodev-owned-tables": ["User", "PushNotificationToken"]
1776
+ },
1777
+ {
1778
+ "name": "User Auth",
1779
+ "x-robodev-hidden": true,
1780
+ "x-robodev-owned-tables": ["AuthnIdentity", "AuthnNonce"]
1781
+ },
1782
+ {
1783
+ "name": "Media",
1784
+ "x-robodev-hidden": true,
1785
+ "x-robodev-owned-tables": ["Media"]
1786
+ },
1787
+ {
1788
+ "name": "Fake Mail",
1789
+ "x-robodev-hidden": true,
1790
+ "x-robodev-owned-tables": ["Mail"]
1791
+ },
1792
+ {
1793
+ "name": "Alien",
1794
+ "x-robodev-hidden": true,
1795
+ "x-robodev-owned-tables": ["Alien"]
1796
+ },
1797
+ {
1798
+ "name": "Planet",
1799
+ "x-robodev-hidden": true,
1800
+ "x-robodev-owned-tables": ["Planet", "PlanetLike"],
1801
+ "x-robodev-media-resources": [
1802
+ {
1803
+ "name": "planet-image",
1804
+ "field": "imageId",
1805
+ "dtoField": "image",
1806
+ "mimeTypes": ["image/jpeg", "image/png", "image/webp"],
1807
+ "maxFileSize": 2097152
1808
+ }
1809
+ ]
1810
+ }
1811
+ ],
1812
+ "x-robodev-user-roles": [
1813
+ {
1814
+ "name": "CLIENT",
1815
+ "description": "Default role for regular users",
1816
+ "isDefault": true
1817
+ }
1818
+ ]
1819
+ }