create-stackr 0.2.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 (274) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +642 -0
  3. package/bin/cli.js +12 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +113 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/config/dependencies.d.ts +82 -0
  9. package/dist/config/dependencies.d.ts.map +1 -0
  10. package/dist/config/dependencies.js +82 -0
  11. package/dist/config/dependencies.js.map +1 -0
  12. package/dist/config/presets.d.ts +3 -0
  13. package/dist/config/presets.d.ts.map +1 -0
  14. package/dist/config/presets.js +174 -0
  15. package/dist/config/presets.js.map +1 -0
  16. package/dist/generators/index.d.ts +40 -0
  17. package/dist/generators/index.d.ts.map +1 -0
  18. package/dist/generators/index.js +130 -0
  19. package/dist/generators/index.js.map +1 -0
  20. package/dist/generators/onboarding.d.ts +8 -0
  21. package/dist/generators/onboarding.d.ts.map +1 -0
  22. package/dist/generators/onboarding.js +141 -0
  23. package/dist/generators/onboarding.js.map +1 -0
  24. package/dist/index.d.ts +3 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +65 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/prompts/features.d.ts +14 -0
  29. package/dist/prompts/features.d.ts.map +1 -0
  30. package/dist/prompts/features.js +96 -0
  31. package/dist/prompts/features.js.map +1 -0
  32. package/dist/prompts/index.d.ts +3 -0
  33. package/dist/prompts/index.d.ts.map +1 -0
  34. package/dist/prompts/index.js +93 -0
  35. package/dist/prompts/index.js.map +1 -0
  36. package/dist/prompts/onboarding.d.ts +6 -0
  37. package/dist/prompts/onboarding.d.ts.map +1 -0
  38. package/dist/prompts/onboarding.js +37 -0
  39. package/dist/prompts/onboarding.js.map +1 -0
  40. package/dist/prompts/orm.d.ts +3 -0
  41. package/dist/prompts/orm.d.ts.map +1 -0
  42. package/dist/prompts/orm.js +23 -0
  43. package/dist/prompts/orm.js.map +1 -0
  44. package/dist/prompts/packageManager.d.ts +2 -0
  45. package/dist/prompts/packageManager.d.ts.map +1 -0
  46. package/dist/prompts/packageManager.js +18 -0
  47. package/dist/prompts/packageManager.js.map +1 -0
  48. package/dist/prompts/platform.d.ts +3 -0
  49. package/dist/prompts/platform.d.ts.map +1 -0
  50. package/dist/prompts/platform.js +21 -0
  51. package/dist/prompts/platform.js.map +1 -0
  52. package/dist/prompts/preset.d.ts +4 -0
  53. package/dist/prompts/preset.d.ts.map +1 -0
  54. package/dist/prompts/preset.js +165 -0
  55. package/dist/prompts/preset.js.map +1 -0
  56. package/dist/prompts/project.d.ts +2 -0
  57. package/dist/prompts/project.d.ts.map +1 -0
  58. package/dist/prompts/project.js +27 -0
  59. package/dist/prompts/project.js.map +1 -0
  60. package/dist/prompts/sdks.d.ts +2 -0
  61. package/dist/prompts/sdks.d.ts.map +1 -0
  62. package/dist/prompts/sdks.js +46 -0
  63. package/dist/prompts/sdks.js.map +1 -0
  64. package/dist/types/index.d.ts +77 -0
  65. package/dist/types/index.d.ts.map +1 -0
  66. package/dist/types/index.js +25 -0
  67. package/dist/types/index.js.map +1 -0
  68. package/dist/utils/cleanup.d.ts +5 -0
  69. package/dist/utils/cleanup.d.ts.map +1 -0
  70. package/dist/utils/cleanup.js +38 -0
  71. package/dist/utils/cleanup.js.map +1 -0
  72. package/dist/utils/copy.d.ts +10 -0
  73. package/dist/utils/copy.d.ts.map +1 -0
  74. package/dist/utils/copy.js +53 -0
  75. package/dist/utils/copy.js.map +1 -0
  76. package/dist/utils/errors.d.ts +33 -0
  77. package/dist/utils/errors.d.ts.map +1 -0
  78. package/dist/utils/errors.js +136 -0
  79. package/dist/utils/errors.js.map +1 -0
  80. package/dist/utils/git.d.ts +5 -0
  81. package/dist/utils/git.d.ts.map +1 -0
  82. package/dist/utils/git.js +33 -0
  83. package/dist/utils/git.js.map +1 -0
  84. package/dist/utils/logger.d.ts +9 -0
  85. package/dist/utils/logger.d.ts.map +1 -0
  86. package/dist/utils/logger.js +22 -0
  87. package/dist/utils/logger.js.map +1 -0
  88. package/dist/utils/package.d.ts +16 -0
  89. package/dist/utils/package.d.ts.map +1 -0
  90. package/dist/utils/package.js +86 -0
  91. package/dist/utils/package.js.map +1 -0
  92. package/dist/utils/system-validation.d.ts +9 -0
  93. package/dist/utils/system-validation.d.ts.map +1 -0
  94. package/dist/utils/system-validation.js +31 -0
  95. package/dist/utils/system-validation.js.map +1 -0
  96. package/dist/utils/template.d.ts +20 -0
  97. package/dist/utils/template.d.ts.map +1 -0
  98. package/dist/utils/template.js +234 -0
  99. package/dist/utils/template.js.map +1 -0
  100. package/dist/utils/validation.d.ts +8 -0
  101. package/dist/utils/validation.d.ts.map +1 -0
  102. package/dist/utils/validation.js +94 -0
  103. package/dist/utils/validation.js.map +1 -0
  104. package/package.json +96 -0
  105. package/templates/base/backend/.dockerignore.ejs +62 -0
  106. package/templates/base/backend/.env.example.ejs +116 -0
  107. package/templates/base/backend/Dockerfile.ejs +142 -0
  108. package/templates/base/backend/controllers/event-queue/index.ts +20 -0
  109. package/templates/base/backend/controllers/event-queue/workers/user.ts +39 -0
  110. package/templates/base/backend/controllers/rest-api/index.ts +48 -0
  111. package/templates/base/backend/controllers/rest-api/plugins/auth.ts +152 -0
  112. package/templates/base/backend/controllers/rest-api/plugins/config.ts +64 -0
  113. package/templates/base/backend/controllers/rest-api/plugins/error-handler.ts +118 -0
  114. package/templates/base/backend/controllers/rest-api/routes/auth.ts.ejs +180 -0
  115. package/templates/base/backend/controllers/rest-api/routes/device-sessions.ts +197 -0
  116. package/templates/base/backend/controllers/rest-api/routes/oauth-web.ts.ejs +375 -0
  117. package/templates/base/backend/controllers/rest-api/server.ts.ejs +87 -0
  118. package/templates/base/backend/domain/device-session/repository.drizzle.ts +209 -0
  119. package/templates/base/backend/domain/device-session/repository.prisma.ts +248 -0
  120. package/templates/base/backend/domain/device-session/schema.ts +72 -0
  121. package/templates/base/backend/domain/session/repository.drizzle.ts +72 -0
  122. package/templates/base/backend/domain/session/repository.prisma.ts +72 -0
  123. package/templates/base/backend/domain/session/schema.ts +29 -0
  124. package/templates/base/backend/domain/user/repository.drizzle.ts +127 -0
  125. package/templates/base/backend/domain/user/repository.prisma.ts +115 -0
  126. package/templates/base/backend/domain/user/schema.ts +14 -0
  127. package/templates/base/backend/drizzle/schema.drizzle.ts +111 -0
  128. package/templates/base/backend/drizzle.config.drizzle.ts +13 -0
  129. package/templates/base/backend/lib/auth.drizzle.ts.ejs +104 -0
  130. package/templates/base/backend/lib/auth.prisma.ts.ejs +97 -0
  131. package/templates/base/backend/lib/constants.ts.ejs +29 -0
  132. package/templates/base/backend/package.json.ejs +50 -0
  133. package/templates/base/backend/prisma/schema.prisma.ejs +102 -0
  134. package/templates/base/backend/prisma.config.prisma.ts +12 -0
  135. package/templates/base/backend/tsconfig.json +39 -0
  136. package/templates/base/backend/utils/db.drizzle.ts +41 -0
  137. package/templates/base/backend/utils/db.prisma.ts +51 -0
  138. package/templates/base/backend/utils/email.ts.ejs +35 -0
  139. package/templates/base/backend/utils/errors.ts +348 -0
  140. package/templates/base/backend/utils/redis.ts.ejs +279 -0
  141. package/templates/base/mobile/.env.example.ejs +35 -0
  142. package/templates/base/mobile/.gitignore.ejs +167 -0
  143. package/templates/base/mobile/app/+not-found.tsx +85 -0
  144. package/templates/base/mobile/app/_layout.tsx.ejs +71 -0
  145. package/templates/base/mobile/app.json.ejs +88 -0
  146. package/templates/base/mobile/assets/images/adaptive-icon.png +0 -0
  147. package/templates/base/mobile/assets/images/favicon.png +0 -0
  148. package/templates/base/mobile/assets/images/icon.png +0 -0
  149. package/templates/base/mobile/assets/images/onboarding_page_1.png +0 -0
  150. package/templates/base/mobile/assets/images/onboarding_page_2.png +0 -0
  151. package/templates/base/mobile/assets/images/onboarding_page_3.png +0 -0
  152. package/templates/base/mobile/assets/images/paywall_image.png +0 -0
  153. package/templates/base/mobile/assets/images/splash.png +0 -0
  154. package/templates/base/mobile/eas.json.ejs +49 -0
  155. package/templates/base/mobile/metro.config.js +9 -0
  156. package/templates/base/mobile/package.json.ejs +53 -0
  157. package/templates/base/mobile/src/components/ui/Button.tsx +131 -0
  158. package/templates/base/mobile/src/components/ui/Card.tsx +68 -0
  159. package/templates/base/mobile/src/components/ui/IconSymbol.tsx +90 -0
  160. package/templates/base/mobile/src/components/ui/Input.tsx +142 -0
  161. package/templates/base/mobile/src/components/ui/LoadingSpinner.tsx +98 -0
  162. package/templates/base/mobile/src/components/ui/OnboardingLayout.tsx +356 -0
  163. package/templates/base/mobile/src/components/ui/PaywallLayout.tsx +311 -0
  164. package/templates/base/mobile/src/components/ui/Skeleton.tsx +58 -0
  165. package/templates/base/mobile/src/components/ui/index.ts +6 -0
  166. package/templates/base/mobile/src/constants/Theme.ts +163 -0
  167. package/templates/base/mobile/src/context/ThemeContext.tsx +157 -0
  168. package/templates/base/mobile/src/lib/auth-client.ts.ejs +51 -0
  169. package/templates/base/mobile/src/services/api.ts.ejs +71 -0
  170. package/templates/base/mobile/src/services/errorService.ts +179 -0
  171. package/templates/base/mobile/src/services/sdkInitializer.ts.ejs +36 -0
  172. package/templates/base/mobile/src/store/index.ts.ejs +18 -0
  173. package/templates/base/mobile/src/store/ui.store.ts +100 -0
  174. package/templates/base/mobile/src/utils/formatters.ts +105 -0
  175. package/templates/base/mobile/src/utils/logger.ts +73 -0
  176. package/templates/base/mobile/src/utils/responsive.ts +234 -0
  177. package/templates/base/mobile/tsconfig.json +32 -0
  178. package/templates/base/web/.env.example.ejs +26 -0
  179. package/templates/base/web/components.json +22 -0
  180. package/templates/base/web/eslint.config.mjs +18 -0
  181. package/templates/base/web/next.config.ts +7 -0
  182. package/templates/base/web/package.json.ejs +35 -0
  183. package/templates/base/web/postcss.config.mjs +7 -0
  184. package/templates/base/web/public/.gitkeep +0 -0
  185. package/templates/base/web/public/file.svg +1 -0
  186. package/templates/base/web/public/globe.svg +1 -0
  187. package/templates/base/web/public/next.svg +1 -0
  188. package/templates/base/web/public/vercel.svg +1 -0
  189. package/templates/base/web/public/window.svg +1 -0
  190. package/templates/base/web/src/app/favicon.ico +0 -0
  191. package/templates/base/web/src/app/globals.css +152 -0
  192. package/templates/base/web/src/app/layout.tsx.ejs +54 -0
  193. package/templates/base/web/src/app/page.tsx.ejs +92 -0
  194. package/templates/base/web/src/components/auth/auth-hydrator.tsx.ejs +19 -0
  195. package/templates/base/web/src/components/auth/protected-route.tsx.ejs +109 -0
  196. package/templates/base/web/src/components/providers/device-session-setup.tsx.ejs +56 -0
  197. package/templates/base/web/src/components/providers/theme-provider.tsx +17 -0
  198. package/templates/base/web/src/components/theme-toggle.tsx +34 -0
  199. package/templates/base/web/src/components/ui/button.tsx +62 -0
  200. package/templates/base/web/src/components/ui/card.tsx +92 -0
  201. package/templates/base/web/src/components/ui/input.tsx +21 -0
  202. package/templates/base/web/src/components/ui/label.tsx +24 -0
  203. package/templates/base/web/src/components/ui/skeleton.tsx +13 -0
  204. package/templates/base/web/src/components/ui/spinner.tsx +20 -0
  205. package/templates/base/web/src/hooks/use-device-session.ts.ejs +40 -0
  206. package/templates/base/web/src/hooks/use-session.ts.ejs +56 -0
  207. package/templates/base/web/src/lib/auth/actions.ts.ejs +334 -0
  208. package/templates/base/web/src/lib/auth/config.ts.ejs +65 -0
  209. package/templates/base/web/src/lib/auth/cookies.ts.ejs +74 -0
  210. package/templates/base/web/src/lib/auth/index.ts.ejs +40 -0
  211. package/templates/base/web/src/lib/auth/oauth.ts.ejs +72 -0
  212. package/templates/base/web/src/lib/auth/pkce.ts.ejs +48 -0
  213. package/templates/base/web/src/lib/auth/sessions.ts.ejs +135 -0
  214. package/templates/base/web/src/lib/auth/user-agent.ts.ejs +47 -0
  215. package/templates/base/web/src/lib/device/actions.ts.ejs +148 -0
  216. package/templates/base/web/src/lib/device/id.ts.ejs +74 -0
  217. package/templates/base/web/src/lib/utils.ts +6 -0
  218. package/templates/base/web/src/proxy.ts.ejs +66 -0
  219. package/templates/base/web/src/store/auth.store.ts.ejs +89 -0
  220. package/templates/base/web/src/store/deviceSession.store.ts.ejs +141 -0
  221. package/templates/base/web/tsconfig.json +34 -0
  222. package/templates/features/mobile/auth/app/(auth)/_layout.tsx +16 -0
  223. package/templates/features/mobile/auth/app/(auth)/login.tsx +86 -0
  224. package/templates/features/mobile/auth/app/(auth)/register.tsx +86 -0
  225. package/templates/features/mobile/auth/components/auth/LoginForm.tsx.ejs +349 -0
  226. package/templates/features/mobile/auth/components/auth/RegisterForm.tsx.ejs +407 -0
  227. package/templates/features/mobile/auth/components/auth/index.ts +2 -0
  228. package/templates/features/mobile/auth/hooks/index.ts.ejs +1 -0
  229. package/templates/features/mobile/auth/hooks/useAuth.ts.ejs +367 -0
  230. package/templates/features/mobile/auth/services/deviceSession.ts +370 -0
  231. package/templates/features/mobile/auth/store/deviceSession.store.ts +326 -0
  232. package/templates/features/mobile/onboarding/app/(onboarding)/_layout.tsx.ejs +11 -0
  233. package/templates/features/mobile/onboarding/app/(onboarding)/page-1.tsx.ejs +52 -0
  234. package/templates/features/mobile/onboarding/app/(onboarding)/page-2.tsx.ejs +52 -0
  235. package/templates/features/mobile/onboarding/app/(onboarding)/page-3.tsx.ejs +60 -0
  236. package/templates/features/mobile/paywall/app/paywall.tsx +550 -0
  237. package/templates/features/mobile/tabs/app/(tabs)/_layout.tsx +26 -0
  238. package/templates/features/mobile/tabs/app/(tabs)/index.tsx +565 -0
  239. package/templates/features/web/.gitkeep +0 -0
  240. package/templates/features/web/auth/app/(app)/dashboard/dashboard-client.tsx.ejs +166 -0
  241. package/templates/features/web/auth/app/(app)/dashboard/page.tsx.ejs +24 -0
  242. package/templates/features/web/auth/app/(app)/layout.tsx.ejs +43 -0
  243. package/templates/features/web/auth/app/(app)/settings/sessions/page.tsx.ejs +29 -0
  244. package/templates/features/web/auth/app/(app)/settings/sessions/sessions-client.tsx.ejs +77 -0
  245. package/templates/features/web/auth/app/(auth)/forgot-password/page.tsx.ejs +127 -0
  246. package/templates/features/web/auth/app/(auth)/layout.tsx.ejs +32 -0
  247. package/templates/features/web/auth/app/(auth)/login/page.tsx.ejs +35 -0
  248. package/templates/features/web/auth/app/(auth)/register/page.tsx.ejs +19 -0
  249. package/templates/features/web/auth/app/(auth)/reset-password/page.tsx.ejs +40 -0
  250. package/templates/features/web/auth/app/(auth)/verify-email/page.tsx.ejs +198 -0
  251. package/templates/features/web/auth/app/auth/callback/route.ts.ejs +152 -0
  252. package/templates/features/web/auth/components/auth/login-form.tsx.ejs +100 -0
  253. package/templates/features/web/auth/components/auth/oauth-buttons.tsx.ejs +126 -0
  254. package/templates/features/web/auth/components/auth/password-reset-form.tsx.ejs +103 -0
  255. package/templates/features/web/auth/components/auth/register-form.tsx.ejs +139 -0
  256. package/templates/features/web/auth/components/settings/session-card.tsx.ejs +132 -0
  257. package/templates/integrations/mobile/adjust/services/adjustService.ts.ejs +163 -0
  258. package/templates/integrations/mobile/adjust/store/adjust.store.ts +243 -0
  259. package/templates/integrations/mobile/att/services/attService.ts +84 -0
  260. package/templates/integrations/mobile/att/services/trackingPermissions.ts +208 -0
  261. package/templates/integrations/mobile/att/store/att.store.ts +162 -0
  262. package/templates/integrations/mobile/revenuecat/services/revenuecatService.ts.ejs +174 -0
  263. package/templates/integrations/mobile/revenuecat/store/revenuecat.store.ts +286 -0
  264. package/templates/integrations/mobile/scate/services/scateService.ts.ejs +85 -0
  265. package/templates/integrations/mobile/scate/store/scate.store.ts +125 -0
  266. package/templates/integrations/web/.gitkeep +0 -0
  267. package/templates/shared/.env.example.ejs +21 -0
  268. package/templates/shared/.gitignore.ejs +145 -0
  269. package/templates/shared/README.md.ejs +134 -0
  270. package/templates/shared/docker-compose.prod.yml.ejs +120 -0
  271. package/templates/shared/docker-compose.yml.ejs +129 -0
  272. package/templates/shared/scripts/docker-dev.sh.ejs +395 -0
  273. package/templates/shared/scripts/docker-prod.sh.ejs +542 -0
  274. package/templates/shared/scripts/setup.sh.ejs +979 -0
@@ -0,0 +1,395 @@
1
+ #!/bin/bash
2
+
3
+ # Development Environment Docker Script
4
+ # Manages the development Docker environment
5
+
6
+ set -e
7
+
8
+ # Colors for output
9
+ RED='\033[0;31m'
10
+ GREEN='\033[0;32m'
11
+ YELLOW='\033[1;33m'
12
+ BLUE='\033[0;34m'
13
+ NC='\033[0m'
14
+
15
+ print_status() {
16
+ echo -e "${GREEN}✓${NC} $1"
17
+ }
18
+
19
+ print_info() {
20
+ echo -e "${BLUE}ℹ${NC} $1"
21
+ }
22
+
23
+ print_warning() {
24
+ echo -e "${YELLOW}⚠${NC} $1"
25
+ }
26
+
27
+ print_error() {
28
+ echo -e "${RED}✗${NC} $1"
29
+ }
30
+
31
+ # Function to show usage
32
+ usage() {
33
+ echo "Full-Stack Auth Boilerplate - Development Environment"
34
+ echo "================================================"
35
+ echo ""
36
+ echo "Usage: $0 [COMMAND] [OPTIONS]"
37
+ echo ""
38
+ echo "Commands:"
39
+ echo " start Start the development environment"
40
+ echo " stop Stop the development environment"
41
+ echo " restart Restart the development environment"
42
+ echo " logs Show logs (specify service: rest-api<% if (backend.eventQueue) { %>, event-queue<% } %>, database<% if (backend.eventQueue) { %>, redis<% } %>)"
43
+ echo " status Show status of all services"
44
+ echo " clean Clean up containers and volumes"
45
+ echo " shell Access microservice container shell"
46
+ echo " db Access database shell"
47
+ echo " health Perform health check on all services"
48
+ echo ""
49
+ echo "Options:"
50
+ echo " --with-pgadmin Include PgAdmin service"
51
+ echo " --build Force rebuild containers"
52
+ echo " --only-rest-api Start only REST API service"
53
+ <% if (backend.eventQueue) { %>
54
+ echo " --only-event-queue Start only Event Queue service"
55
+ <% } %>
56
+ echo ""
57
+ echo "Examples:"
58
+ echo " $0 start # Start all services<% if (backend.eventQueue) { %> (includes Redis)<% } %>"
59
+ echo " $0 start --with-pgadmin # Start with PgAdmin"
60
+ echo " $0 start --only-rest-api # Start only REST API"
61
+ echo " $0 logs rest-api # Show REST API logs"
62
+ <% if (backend.eventQueue) { %>
63
+ echo " $0 logs event-queue # Show Event Queue logs"
64
+ echo " $0 logs redis # Show Redis logs"
65
+ <% } %>
66
+ echo " $0 restart --build # Restart with rebuild"
67
+ echo ""
68
+ }
69
+
70
+ # Parse command line arguments
71
+ parse_args() {
72
+ COMMAND=""
73
+ SERVICE=""
74
+ WITH_PGADMIN=false
75
+ FORCE_BUILD=false
76
+ ONLY_REST_API=false
77
+ <% if (backend.eventQueue) { %>
78
+ ONLY_EVENT_QUEUE=false
79
+ <% } %>
80
+
81
+ while [[ $# -gt 0 ]]; do
82
+ case $1 in
83
+ start|stop|restart|logs|status|clean|shell|db|health)
84
+ COMMAND="$1"
85
+ shift
86
+ ;;
87
+ rest-api<% if (backend.eventQueue) { %>|event-queue<% } %>|database<% if (backend.eventQueue) { %>|redis<% } %>)
88
+ SERVICE="$1"
89
+ shift
90
+ ;;
91
+ --with-pgadmin)
92
+ WITH_PGADMIN=true
93
+ shift
94
+ ;;
95
+ --build)
96
+ FORCE_BUILD=true
97
+ shift
98
+ ;;
99
+ --only-rest-api)
100
+ ONLY_REST_API=true
101
+ shift
102
+ ;;
103
+ <% if (backend.eventQueue) { %>
104
+ --only-event-queue)
105
+ ONLY_EVENT_QUEUE=true
106
+ shift
107
+ ;;
108
+ <% } %>
109
+ -h|--help)
110
+ usage
111
+ exit 0
112
+ ;;
113
+ *)
114
+ echo "Unknown option: $1"
115
+ usage
116
+ exit 1
117
+ ;;
118
+ esac
119
+ done
120
+
121
+ if [ -z "$COMMAND" ]; then
122
+ usage
123
+ exit 1
124
+ fi
125
+ }
126
+
127
+ # Build compose command with profiles
128
+ build_compose_cmd() {
129
+ local cmd="docker-compose"
130
+
131
+ # Handle microservices profiles
132
+ if [ "$ONLY_REST_API" = true ]; then
133
+ cmd="$cmd --profile rest-api"
134
+ <% if (backend.eventQueue) { %>
135
+ elif [ "$ONLY_EVENT_QUEUE" = true ]; then
136
+ cmd="$cmd --profile event-queue"
137
+ <% } %>
138
+ else
139
+ cmd="$cmd --profile all"
140
+ fi
141
+
142
+
143
+ if [ "$WITH_PGADMIN" = true ]; then
144
+ cmd="$cmd --profile with-pgadmin"
145
+ fi
146
+
147
+ echo "$cmd"
148
+ }
149
+
150
+ # Start services
151
+ start_services() {
152
+ local compose_cmd=$(build_compose_cmd)
153
+
154
+ print_info "Starting development environment..."
155
+
156
+ if [ "$FORCE_BUILD" = true ]; then
157
+ print_info "Force rebuilding containers..."
158
+ $compose_cmd build --no-cache
159
+ fi
160
+
161
+ # Start services
162
+ $compose_cmd up -d
163
+
164
+ print_status "Services started successfully!"
165
+
166
+ # Show service URLs
167
+ echo ""
168
+ print_info "Service URLs:"
169
+
170
+ if [ "$ONLY_REST_API" = true ]; then
171
+ echo " 🌐 REST API: http://localhost:8080"
172
+ <% if (backend.eventQueue) { %>
173
+ elif [ "$ONLY_EVENT_QUEUE" = true ]; then
174
+ echo " 📋 Event Queue: Running in background (no HTTP interface)"
175
+ <% } %>
176
+ else
177
+ echo " 🌐 REST API: http://localhost:8080"
178
+ <% if (backend.eventQueue) { %>
179
+ echo " 📋 Event Queue: Running in background (no HTTP interface)"
180
+ <% } %>
181
+ fi
182
+
183
+ echo " 🗄️ Database: localhost:5432"
184
+ <% if (backend.eventQueue) { %>
185
+ echo " 🔄 Redis: localhost:6379"
186
+ <% } %>
187
+
188
+ if [ "$WITH_PGADMIN" = true ]; then
189
+ echo " 🔧 PgAdmin: http://localhost:8081"
190
+ echo " Login: admin@example.com / admin"
191
+ fi
192
+
193
+ echo ""
194
+ print_info "Use './scripts/docker-dev.sh logs' to view logs"
195
+ print_info "Use './scripts/docker-dev.sh status' to check service status"
196
+ }
197
+
198
+ # Stop services
199
+ stop_services() {
200
+ local compose_cmd=$(build_compose_cmd)
201
+
202
+ print_info "Stopping development environment..."
203
+ $compose_cmd down
204
+ print_status "Services stopped successfully!"
205
+ }
206
+
207
+ # Restart services
208
+ restart_services() {
209
+ local compose_cmd=$(build_compose_cmd)
210
+
211
+ print_info "Restarting development environment..."
212
+
213
+ if [ "$FORCE_BUILD" = true ]; then
214
+ print_info "Force rebuilding containers..."
215
+ $compose_cmd down
216
+ $compose_cmd build --no-cache
217
+ $compose_cmd up -d
218
+ else
219
+ $compose_cmd restart
220
+ fi
221
+
222
+ print_status "Services restarted successfully!"
223
+ }
224
+
225
+ # Show logs
226
+ show_logs() {
227
+ local compose_cmd=$(build_compose_cmd)
228
+
229
+ if [ -n "$SERVICE" ]; then
230
+ print_info "Showing logs for $SERVICE..."
231
+ $compose_cmd logs -f "$SERVICE"
232
+ else
233
+ print_info "Showing logs for all services..."
234
+ $compose_cmd logs -f
235
+ fi
236
+ }
237
+
238
+ # Show status
239
+ show_status() {
240
+ local compose_cmd=$(build_compose_cmd)
241
+
242
+ print_info "Service Status:"
243
+ $compose_cmd ps
244
+
245
+ echo ""
246
+ print_info "Container Health:"
247
+ docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep auth_boilerplate || echo "No containers running"
248
+ }
249
+
250
+ # Clean up
251
+ clean_up() {
252
+ local compose_cmd=$(build_compose_cmd)
253
+
254
+ print_warning "This will remove all containers and volumes!"
255
+ read -p "Are you sure? (y/N): " -n 1 -r
256
+ echo
257
+
258
+ if [[ $REPLY =~ ^[Yy]$ ]]; then
259
+ print_info "Cleaning up containers and volumes..."
260
+ $compose_cmd down -v --remove-orphans
261
+
262
+ # Remove unused volumes
263
+ docker volume prune -f
264
+
265
+ print_status "Cleanup complete!"
266
+ else
267
+ print_info "Cleanup cancelled"
268
+ fi
269
+ }
270
+
271
+ # Access backend shell
272
+ backend_shell() {
273
+ print_info "Accessing microservice container shell..."
274
+
275
+ # Try to access rest-api first<% if (backend.eventQueue) { %>, then event-queue<% } %>
276
+ if docker-compose exec rest-api sh 2>/dev/null; then
277
+ return
278
+ <% if (backend.eventQueue) { %>
279
+ elif docker-compose exec event-queue sh 2>/dev/null; then
280
+ return
281
+ <% } %>
282
+ else
283
+ print_error "No microservice containers are running"
284
+ print_info "Start services first: ./scripts/docker-dev.sh start"
285
+ print_info "Or specify a service: ./scripts/docker-dev.sh start --only-rest-api"
286
+ fi
287
+ }
288
+
289
+ # Access database shell
290
+ database_shell() {
291
+ print_info "Accessing database shell..."
292
+ docker-compose exec database psql -U postgres -d auth_boilerplate || {
293
+ print_error "Database container is not running"
294
+ print_info "Start services first: ./scripts/docker-dev.sh start"
295
+ }
296
+ }
297
+
298
+ # Health check
299
+ health_check() {
300
+ print_info "Performing health check..."
301
+
302
+ # Check if containers are running
303
+ if docker-compose ps | grep -q "Up"; then
304
+ print_status "Containers are running"
305
+
306
+ # Check REST API if it's running
307
+ if docker-compose ps | grep -q "rest_api.*Up"; then
308
+ if curl -sf http://localhost:8080/ > /dev/null 2>&1; then
309
+ print_status "REST API is responding"
310
+ else
311
+ print_warning "REST API is not responding"
312
+ fi
313
+ else
314
+ print_info "REST API service is not running"
315
+ fi
316
+
317
+ <% if (backend.eventQueue) { %>
318
+ # Check Event Queue if it's running
319
+ if docker-compose ps | grep -q "event_queue.*Up"; then
320
+ print_status "Event Queue service is running"
321
+ else
322
+ print_info "Event Queue service is not running"
323
+ fi
324
+
325
+ <% } %>
326
+ # Check database
327
+ if docker-compose exec -T database pg_isready -U postgres > /dev/null 2>&1; then
328
+ print_status "Database is ready"
329
+ else
330
+ print_warning "Database is not ready"
331
+ fi
332
+
333
+ <% if (backend.eventQueue) { %>
334
+ # Check Redis
335
+ if docker-compose exec -T redis redis-cli ping > /dev/null 2>&1; then
336
+ print_status "Redis is ready"
337
+ else
338
+ print_warning "Redis is not ready"
339
+ fi
340
+ <% } %>
341
+ else
342
+ print_error "No containers are running"
343
+ print_info "Start services first: ./scripts/docker-dev.sh start"
344
+ fi
345
+ }
346
+
347
+ # Main execution
348
+ main() {
349
+ # Check if we're in the right directory
350
+ if [ ! -f "docker-compose.yml" ]; then
351
+ print_error "docker-compose.yml not found!"
352
+ print_info "Please run this script from the project root directory"
353
+ exit 1
354
+ fi
355
+
356
+ parse_args "$@"
357
+
358
+ case $COMMAND in
359
+ start)
360
+ start_services
361
+ ;;
362
+ stop)
363
+ stop_services
364
+ ;;
365
+ restart)
366
+ restart_services
367
+ ;;
368
+ logs)
369
+ show_logs
370
+ ;;
371
+ status)
372
+ show_status
373
+ ;;
374
+ clean)
375
+ clean_up
376
+ ;;
377
+ shell)
378
+ backend_shell
379
+ ;;
380
+ db)
381
+ database_shell
382
+ ;;
383
+ health)
384
+ health_check
385
+ ;;
386
+ *)
387
+ print_error "Unknown command: $COMMAND"
388
+ usage
389
+ exit 1
390
+ ;;
391
+ esac
392
+ }
393
+
394
+ # Run main function
395
+ main "$@"