create-autostack 1.0.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 (96) hide show
  1. package/README.md +237 -0
  2. package/bin/index.js +675 -0
  3. package/lib/PackageManagerClass.js +185 -0
  4. package/package.json +55 -0
  5. package/templates/assets/fastapi.svg +1 -0
  6. package/templates/assets/flask.svg +1 -0
  7. package/templates/assets/mongodb.svg +1 -0
  8. package/templates/assets/mysql.svg +1 -0
  9. package/templates/assets/nodejs.svg +1 -0
  10. package/templates/assets/postgresql.svg +1 -0
  11. package/templates/backend/FASTAPI/MONGODB/.env +1 -0
  12. package/templates/backend/FASTAPI/MONGODB/config.py +26 -0
  13. package/templates/backend/FASTAPI/MONGODB/main.py +32 -0
  14. package/templates/backend/FASTAPI/MONGODB/models.py +56 -0
  15. package/templates/backend/FASTAPI/MONGODB/requirements.txt +6 -0
  16. package/templates/backend/FASTAPI/MONGODB/routes.py +189 -0
  17. package/templates/backend/FASTAPI/MONGODB/schemas.py +31 -0
  18. package/templates/backend/FASTAPI/MYSQL/.env +5 -0
  19. package/templates/backend/FASTAPI/MYSQL/config.py +29 -0
  20. package/templates/backend/FASTAPI/MYSQL/main.py +32 -0
  21. package/templates/backend/FASTAPI/MYSQL/models.py +31 -0
  22. package/templates/backend/FASTAPI/MYSQL/requirements.txt +6 -0
  23. package/templates/backend/FASTAPI/MYSQL/routes.py +180 -0
  24. package/templates/backend/FASTAPI/MYSQL/schemas.py +36 -0
  25. package/templates/backend/FASTAPI/POSTGRESQL/.env +5 -0
  26. package/templates/backend/FASTAPI/POSTGRESQL/config.py +29 -0
  27. package/templates/backend/FASTAPI/POSTGRESQL/main.py +32 -0
  28. package/templates/backend/FASTAPI/POSTGRESQL/models.py +31 -0
  29. package/templates/backend/FASTAPI/POSTGRESQL/requirements.txt +6 -0
  30. package/templates/backend/FASTAPI/POSTGRESQL/routes.py +180 -0
  31. package/templates/backend/FASTAPI/POSTGRESQL/schemas.py +36 -0
  32. package/templates/backend/FLASK/MONGODB/.env +6 -0
  33. package/templates/backend/FLASK/MONGODB/config.py +27 -0
  34. package/templates/backend/FLASK/MONGODB/main.py +5 -0
  35. package/templates/backend/FLASK/MONGODB/models.py +16 -0
  36. package/templates/backend/FLASK/MONGODB/requirements.txt +6 -0
  37. package/templates/backend/FLASK/MONGODB/routes.py +137 -0
  38. package/templates/backend/FLASK/MYSQL/.env +7 -0
  39. package/templates/backend/FLASK/MYSQL/config.py +24 -0
  40. package/templates/backend/FLASK/MYSQL/main.py +8 -0
  41. package/templates/backend/FLASK/MYSQL/models.py +26 -0
  42. package/templates/backend/FLASK/MYSQL/requirements.txt +6 -0
  43. package/templates/backend/FLASK/MYSQL/routes.py +135 -0
  44. package/templates/backend/FLASK/POSTGRESQL/.env +5 -0
  45. package/templates/backend/FLASK/POSTGRESQL/config.py +24 -0
  46. package/templates/backend/FLASK/POSTGRESQL/main.py +7 -0
  47. package/templates/backend/FLASK/POSTGRESQL/models.py +26 -0
  48. package/templates/backend/FLASK/POSTGRESQL/requirements.txt +6 -0
  49. package/templates/backend/FLASK/POSTGRESQL/routes.py +134 -0
  50. package/templates/backend/NODEJS/MONGODB/config/dbConn.js +11 -0
  51. package/templates/backend/NODEJS/MONGODB/controllers/noteController.js +79 -0
  52. package/templates/backend/NODEJS/MONGODB/controllers/userController.js +79 -0
  53. package/templates/backend/NODEJS/MONGODB/index.js +39 -0
  54. package/templates/backend/NODEJS/MONGODB/models/noteModel.js +17 -0
  55. package/templates/backend/NODEJS/MONGODB/models/userModel.js +17 -0
  56. package/templates/backend/NODEJS/MYSQL/config/dbConn.js +20 -0
  57. package/templates/backend/NODEJS/MYSQL/controllers/noteController.js +97 -0
  58. package/templates/backend/NODEJS/MYSQL/controllers/userController.js +98 -0
  59. package/templates/backend/NODEJS/MYSQL/index.js +39 -0
  60. package/templates/backend/NODEJS/MYSQL/models.txt +3 -0
  61. package/templates/backend/NODEJS/POSTGRESQL/config/dbConn.js +28 -0
  62. package/templates/backend/NODEJS/POSTGRESQL/controllers/noteController.js +91 -0
  63. package/templates/backend/NODEJS/POSTGRESQL/controllers/userController.js +92 -0
  64. package/templates/backend/NODEJS/POSTGRESQL/index.js +39 -0
  65. package/templates/backend/NODEJS/POSTGRESQL/models.txt +3 -0
  66. package/templates/backend/NODEJS/common/middleware/upstash.js +12 -0
  67. package/templates/backend/NODEJS/common/routes/noteRoutes.js +22 -0
  68. package/templates/backend/NODEJS/common/routes/userRoutes.js +22 -0
  69. package/templates/frontend/PREACT/src/app.jsx +103 -0
  70. package/templates/frontend/PREACT/vite.config.js +8 -0
  71. package/templates/frontend/PREACT-TS/src/app.tsx +112 -0
  72. package/templates/frontend/PREACT-TS/vite.config.ts +8 -0
  73. package/templates/frontend/REACT/src/App.css +27 -0
  74. package/templates/frontend/REACT/src/App.jsx +105 -0
  75. package/templates/frontend/REACT/vite.config.js +8 -0
  76. package/templates/frontend/REACT-SWC/src/App.css +27 -0
  77. package/templates/frontend/REACT-SWC/src/App.jsx +105 -0
  78. package/templates/frontend/REACT-SWC/vite.config.js +8 -0
  79. package/templates/frontend/REACT-SWC-TS/src/App.css +27 -0
  80. package/templates/frontend/REACT-SWC-TS/src/App.tsx +114 -0
  81. package/templates/frontend/REACT-SWC-TS/vite.config.ts +8 -0
  82. package/templates/frontend/REACT-TS/src/App.css +27 -0
  83. package/templates/frontend/REACT-TS/src/App.tsx +114 -0
  84. package/templates/frontend/REACT-TS/vite.config.ts +8 -0
  85. package/templates/frontend/SOLID/src/App.jsx +104 -0
  86. package/templates/frontend/SOLID/vite.config.js +7 -0
  87. package/templates/frontend/SOLID-TS/src/App.tsx +116 -0
  88. package/templates/frontend/SOLID-TS/vite.config.ts +7 -0
  89. package/templates/frontend/SVELTE/src/App.svelte +104 -0
  90. package/templates/frontend/SVELTE/vite.config.js +8 -0
  91. package/templates/frontend/SVELTE-TS/src/App.svelte +116 -0
  92. package/templates/frontend/SVELTE-TS/vite.config.ts +8 -0
  93. package/templates/frontend/VUE/src/App.vue +96 -0
  94. package/templates/frontend/VUE/vite.config.js +8 -0
  95. package/templates/frontend/VUE-TS/src/App.vue +112 -0
  96. package/templates/frontend/VUE-TS/vite.config.ts +8 -0
@@ -0,0 +1,185 @@
1
+
2
+ import { execSync } from 'node:child_process';
3
+ import { platform } from 'os';
4
+
5
+ class PackageManagerCommands {
6
+ constructor(manager) {
7
+ this.manager = manager;
8
+ this.isWindows = platform() === 'win32';
9
+ }
10
+
11
+ init() {
12
+ const commands = {
13
+ npm: 'npm init -y',
14
+ yarn: 'yarn init -y',
15
+ pnpm: 'pnpm init',
16
+ bun: 'bun init -y',
17
+ pip: null, // No init needed for Python
18
+ deno: 'deno init'
19
+ };
20
+ return commands[this.manager];
21
+ }
22
+
23
+ install(packages = [], dev = false) {
24
+ // Install all dependencies from lock file
25
+ if (packages.length === 0) {
26
+ const commands = {
27
+ npm: 'npm install',
28
+ yarn: 'yarn install',
29
+ pnpm: 'pnpm install',
30
+ bun: 'bun install',
31
+ pip: `${this.getVenvPip()} install -r requirements.txt`,
32
+ deno: null
33
+ };
34
+ return commands[this.manager];
35
+ }
36
+
37
+ // Install specific packages
38
+ const pkgString = packages.join(' ');
39
+
40
+ switch (this.manager) {
41
+ case 'npm':
42
+ return `npm install ${dev ? '-D ' : ''}${pkgString}`;
43
+
44
+ case 'yarn':
45
+ return `yarn add ${dev ? '-D ' : ''}${pkgString}`;
46
+
47
+ case 'pnpm':
48
+ return `pnpm add ${dev ? '-D ' : ''}${pkgString}`;
49
+
50
+ case 'bun':
51
+ return `bun add ${dev ? '-d ' : ''}${pkgString}`;
52
+
53
+ case 'pip':
54
+ return `${this.getVenvPip()} install ${pkgString}`;
55
+
56
+ case 'deno':
57
+ return null; // Deno imports via URLs
58
+
59
+ default:
60
+ throw new Error(`Unknown package manager: ${this.manager}`);
61
+ }
62
+ }
63
+
64
+ run(script) {
65
+ const commands = {
66
+ npm: `npm run ${script}`,
67
+ yarn: `yarn ${script}`,
68
+ pnpm: `pnpm ${script}`,
69
+ bun: `bun ${script}`,
70
+ pip: `${this.getVenvPython()} ${script}`,
71
+ deno: `deno task ${script}`
72
+ };
73
+ return commands[this.manager];
74
+ }
75
+
76
+ execute(command) {
77
+ const commands = {
78
+ npm: `npx ${command}`,
79
+ yarn: `yarn dlx ${command}`,
80
+ pnpm: `pnpm dlx ${command}`,
81
+ bun: `bunx ${command}`,
82
+ pip: null,
83
+ deno: `deno run ${command}`
84
+ };
85
+ return commands[this.manager];
86
+ }
87
+
88
+ create(template) {
89
+ const commands = {
90
+ npm: `npm create vite@latest ${template}`,
91
+ yarn: `yarn create vite ${template}`,
92
+ pnpm: `pnpm create vite ${template}`,
93
+ bun: `bun create vite ${template}`,
94
+ pip: this.createVirtualEnv(),
95
+ deno: `deno init ${template}`
96
+ };
97
+ return commands[this.manager];
98
+ }
99
+
100
+
101
+ getPythonCommand() {
102
+ const pythonCommands = ['python3', 'python', 'py'];
103
+
104
+ for (const cmd of pythonCommands) {
105
+ try {
106
+ execSync(`${cmd} --version`, { stdio: 'ignore' });
107
+ return cmd;
108
+ } catch(error) {
109
+ console.log(error);
110
+ continue;
111
+ }
112
+ }
113
+
114
+ throw new Error('Python not found. Please install Python 3.7+');
115
+ }
116
+
117
+ getPythonVersion() {
118
+ try {
119
+ const pythonCmd = this.getPythonCommand();
120
+ const version = execSync(`${pythonCmd} --version`, { encoding: 'utf8' });
121
+ const match = version.match(/Python (\d+)\.(\d+)/);
122
+
123
+ if (match) {
124
+ return {
125
+ major: parseInt(match[1]),
126
+ minor: parseInt(match[2]),
127
+ full: `${match[1]}.${match[2]}`
128
+ };
129
+ }
130
+ } catch (error) {
131
+ throw new Error('Could not detect Python version');
132
+ }
133
+ }
134
+
135
+ createVirtualEnv(venvName = '.venv') {
136
+ const pythonCmd = this.getPythonCommand();
137
+ const version = this.getPythonVersion();
138
+
139
+ if (version.major >= 3 && version.minor >= 3) {
140
+ return `${pythonCmd} -m venv ${venvName}`;
141
+ }
142
+
143
+ return `${pythonCmd} -m virtualenv ${venvName}`;
144
+ }
145
+
146
+ // Get path to venv's Python executable
147
+ getVenvPython(venvName = '.venv') {
148
+ return this.isWindows
149
+ ? `${venvName}\\Scripts\\python.exe`
150
+ : `${venvName}/bin/python`;
151
+ }
152
+
153
+ // Get path to venv's pip executable
154
+ getVenvPip(venvName = '.venv') {
155
+ return this.isWindows
156
+ ? `${venvName}\\Scripts\\pip.exe`
157
+ : `${venvName}/bin/pip`;
158
+ }
159
+
160
+ // Not required due to requirements.txt in templates. Simply installing
161
+ // freezeRequirements(venvName = '.venv') {
162
+ // if (this.manager !== 'pip') {
163
+ // throw new Error('freezeRequirements is only for Python (pip)');
164
+ // }
165
+
166
+ // const pip = this.getVenvPip(venvName);
167
+ // return `${pip} freeze > requirements.txt`;
168
+ // }
169
+
170
+ getActivationInstructions(venvName = '.venv') {
171
+ if (this.isWindows) {
172
+ return {
173
+ gitBash: `source ${venvName}/Scripts/activate`,
174
+ cmd: `${venvName}\\Scripts\\activate.bat`,
175
+ powershell: `${venvName}\\Scripts\\Activate.ps1`
176
+ };
177
+ } else {
178
+ return {
179
+ bash: `source ${venvName}/bin/activate`
180
+ };
181
+ }
182
+ }
183
+ }
184
+
185
+ export default PackageManagerCommands;
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "create-autostack",
3
+ "version": "1.0.0",
4
+ "description": "Scaffold full-stack applications with a single command",
5
+ "type": "module",
6
+
7
+ "bin": {
8
+ "create-autostack": "./bin/index.js"
9
+ },
10
+
11
+ "files": [
12
+ "bin",
13
+ "lib",
14
+ "templates"
15
+ ],
16
+
17
+ "keywords": [
18
+ "scaffolding",
19
+ "cli",
20
+ "mern",
21
+ "flask",
22
+ "full-stack",
23
+ "boilerplate",
24
+ "generator",
25
+ "vite",
26
+ "react",
27
+ "python",
28
+ "vue",
29
+ "vite",
30
+ "solid",
31
+ "mongodb",
32
+ "postgresql",
33
+ "mysql",
34
+ "typescript",
35
+ "fastapi"
36
+ ],
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/FahadR004/AutoStack.git"
40
+ },
41
+ "author": "Fahad Rasheed",
42
+ "license": "ISC",
43
+ "bugs": {
44
+ "url": "https://github.com/FahadR004/AutoStack/issues"
45
+ },
46
+ "homepage": "https://github.com/FahadR004/AutoStack#readme",
47
+ "dependencies": {
48
+ "@clack/prompts": "^0.11.0",
49
+ "figlet": "^1.9.4",
50
+ "inquirer": "^13.1.0",
51
+ "mri": "^1.2.0",
52
+ "nanospinner": "^1.2.2",
53
+ "picocolors": "^1.1.1"
54
+ }
55
+ }
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path d="M56.813 127.586c-1.903-.227-3.899-.52-4.434-.652a48.078 48.078 0 00-2.375-.5 36.042 36.042 0 01-2.703-.633c-4.145-1.188-4.442-1.285-7.567-2.563-2.875-1.172-8.172-3.91-9.984-5.156-.496-.344-.96-.621-1.031-.621-.07 0-1.23-.816-2.578-1.813-8.57-6.343-15.004-14.043-19.653-23.527-.8-1.629-1.453-3.074-1.453-3.21 0-.134-.144-.505-.32-.817-.363-.649-.88-2.047-1.297-3.492a20.047 20.047 0 00-.625-1.813c-.195-.46-.352-1.02-.352-1.246 0-.227-.195-.965-.433-1.645-.238-.675-.43-1.472-.43-1.77 0-.296-.187-1.32-.418-2.276C.598 73.492 0 67.379 0 63.953c0-3.422.598-9.535 1.16-11.894.23-.957.418-2 .418-2.32 0-.321.145-.95.32-1.4.18-.448.41-1.253.516-1.788.11-.535.36-1.457.563-2.055l.59-1.726c.433-1.293.835-2.387 1.027-2.813.11-.238.539-1.21.957-2.16.676-1.535 2.125-4.43 2.972-5.945.309-.555.426-.739 2.098-3.352 2.649-4.148 7.176-9.309 11.39-12.988 1.485-1.297 6.446-5.063 6.669-5.063.062 0 .53-.281 1.043-.625 1.347-.902 2.668-1.668 4.39-2.531a53.06 53.06 0 001.836-.953c.285-.164.82-.41 3.567-1.64.605-.27 1.257-.516 3.136-1.173.414-.144 1.246-.449 1.84-.672.598-.222 1.301-.406 1.563-.406.258 0 .937-.18 1.508-.402.57-.223 1.605-.477 2.304-.563.696-.082 1.621-.277 2.055-.43.43-.148 1.61-.34 2.621-.425a72.572 72.572 0 003.941-.465c2.688-.394 8.532-.394 11.192 0a75.02 75.02 0 003.781.445c.953.079 2.168.278 2.703.442.535.16 1.461.36 2.055.433.594.079 1.594.325 2.222.551.63.23 1.344.414 1.59.414s.754.137 1.125.309c.375.168 1.168.449 1.766.625.594.18 1.613.535 2.27.797.652.261 1.527.605 1.945.761.77.29 6.46 3.137 7.234 3.622 6.281 3.917 9.512 6.476 13.856 10.964 5.238 5.414 8.715 10.57 12.254 18.16.25.536.632 1.329.851 1.758.215.434.395.942.395 1.13 0 .19.18.76.402 1.269.602 1.383 1.117 2.957 1.36 4.16.12.59.343 1.32.495 1.621.153.3.332 1.063.403 1.688.07.624.277 1.648.453 2.269 1.02 3.531 1.527 13.934.91 18.535-.183 1.367-.39 3.02-.46 3.672-.118 1.117-.708 4.004-1.212 5.945l-.52 2.055c-.98 3.957-3.402 9.594-6.359 14.809-1.172 2.07-5.101 7.668-5.843 8.324-.067.058-.399.45-.735.863-.336.418-1.414 1.586-2.39 2.594-4.301 4.441-7.77 7.187-13.86 10.969-.722.449-6.847 3.441-7.992 3.906-.594.238-1.586.64-2.203.89-.613.247-1.297.454-1.512.458-.215.003-.781.195-1.258.425-.476.23-1.082.422-1.351.426-.266.004-1.043.192-1.727.418-.683.23-1.633.477-2.11.55-.476.075-1.495.278-2.269.45-.773.172-3.11.508-5.187.746a59.06 59.06 0 01-13.945-.031zm4.703-12.5c.3-.234.609-.7.691-1.027.18-.723 29.234-58.97 29.781-59.7.461-.617.504-1.605.082-1.953-.222-.187-3.004-.246-10.43-.234-5.57.012-10.253.016-10.406.012-.226-.008-.273-3.73-.25-19.672.016-10.817-.035-19.766-.113-19.89-.078-.126-.383-.227-.68-.227-.418 0-.613.18-.87.808-.485 1.168-1.825 3.82-8.348 16.485a3554.569 3554.569 0 00-4.055 7.89c-1.156 2.262-2.98 5.813-4.047 7.89a8751.248 8751.248 0 00-8.598 16.759c-4.933 9.636-5.53 10.785-5.742 11.039-.41.496-.633 1.64-.402 2.07.21.394.629.41 11.043.394 5.953-.007 10.863.024 10.914.07.137.141.086 37.31-.055 38.196-.093.582-.031.89.235 1.156.46.461.586.457 1.25-.066zm0 0" fill="#049688"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#010101" d="M44.44 100.63c-4.23-3.33-8.74-6.52-11.83-11.01-6.49-7.92-11.49-17.1-14.9-26.74-2.07-6.27-2.77-12.99-5.44-19.02-2.78-4.38.48-9.16 5.27-10.55 2.13-.41 5.89-2.43 1.36-.98-4.06 2.98-4.45-2.71-.29-3.07 2.84-.38 3.89-2.7 2.92-4.8-3.05-1.99 7.4-4.18 2.14-7.15-5.48-5.91 7.66-7.05 4.42-.33-.77 5.16 9.18-.95 6.87 5.01 2.35 2.86 8.8.65 8.63 4.67 3.42.24 4.6 3.11 7.8 3.33 3.33 1.5 9.36 2.69 10.49 6.44-3.3 2.61-10.95-5.4-11.31 1.84 1 10.69.74 21.7 4.65 31.88 1.85 6.16 6.33 11.01 10.38 15.81 3.88 4.7 9.12 8.01 14.48 10.8 4.69 2.21 9.75 3.68 14.87 4.6 2.07-1.59 5.74-7.48 8.97-5 .16 2.8-6.42 5.84-.31 5.54 3.59-1.08 6.08 2.77 9.04-.71 2.72 3.23 11.32-2.06 9.38 4.53-2.62 1.69-6.44.67-9.07 3-4.33-2.16-7.77 1.93-12.56 1.42-5.32.95-10.73 1.34-16.13 1.34-8.85-.7-17.89-.99-26.3-4.07-4.74-1.38-9.37-4.08-13.53-6.78zm7.47 3.24c4.63 2 9.16 4.11 14.23 4.75 8.05 1.12 16.37 2.84 24.45 1.27-3.66-1.65-7.44.64-11.08-1.18-4.37.94-9.06-.24-13.5-.82-5.05-2.25-10.5-3.8-15.23-6.72-5.91-2.16 3.06 2.77 4.65 3.17 3.69 2.1-4.06-1.08-5.16-1.95-3.09-1.74-3.49-1.37-.31.39.64.37 1.28.77 1.95 1.09zm-8.81-6.23c4.49 1.66-.02-3.16-2.07-2.88-.91-1.58-3.48-2.58-1.67-3.43-3.26 1.13-3.42-4.3-4.95-3.53-3.45-1.09-1.34-4.95-5.45-7.32-.37-2.5-4.08-4.66-5.26-8.43-.52-1.93-4.19-7.46-1.94-2.31 1.92 4.96 5.29 9.21 8.1 13.45 2.18 4.04 4.76 8.26 8.72 10.78 1.34 1.3 2.63 3.27 4.52 3.67zM30.17 83.45c.16-.68.82 1.46 0 0zm18.3 16.18c1-.44-1.43-.56 0 0zm2.44.89c-.25-1.23-1.11.69 0 0zm3.05 1.27c1.45-1.38-2.24-.87 0 0zm5.22 2.91c.89-1.3-2.82-.49 0 0zm-10.03-6.99c2.25-1.46-2.91-.02 0 0zm2.29 1.14c-.07-.77-.82.34 0 0zm11.43 7.13c1.84 1.16 10.73 2.54 5.16.48-.93.2-10.33-2.66-5.16-.48zM44.72 91.85c-.18-.77-2.85-.85 0 0zm5.32 3.1c1.39-.96-2.87-.74 0 0zm4.48 2.75c1.98-.75-3.23-.75 0 0zm-11.97-8.21c2.16 1.65 8.7.21 3.3-.99-2.45-1.31-7.99-2.2-4.22.79l.92.2zm15 9.16c.9-1.53-3.77-.88 0 0zm-4.56-3.63c5.27 1.49-4.43-3.34-1.3-.55l.7.32.6.23zm9.14 5.28c4.99.05-4.51-.68 0 0zm-21.5-13.7c-.19-.93-1.23.08 0 0zm29.94 18.44c.14-1.68-1.62 1.25 0 0zM49.15 91.82c-.3-.88-1.56-.04 0 0zm-8.04-5.8c2.86-.17-3.93-1.26 0 0zm-9.54-6.16c-.36-1.38-3.12-2.47 0 0zM56.6 95.74c-.52-.6-.25.13 0 0zm15.58 9.56c-.05-.91-.85.35 0 0zM55.22 94.32c.28-1.18-2.44-.36 0 0zm-11.6-7.36c2.13-.23-3.42-1.44 0 0zm19.63 12.2c3.32-1.32-3.24-.64 0 0zm-10.21-6.93c3.83.49-4.56-2.61-.84-.28l.84.28zm13.31 8.19c3.58-2.14 2.4 5.01 6.07.6 3.62-2.64-3.13 3.27 1.33.47 3.23-2.16 7.99 1.02 11 2.06 2.16-.11 4.27 1.87 6.49.67 4.27-1.15-8.36-1.71-5.05-3.75-3.91 1.14-6.8-1.36-8.72-3.86-4.39-1.01-9.46-3.25-11.65-7.14-.89-1.46 1.29.21-.77-2.18-2.64-2.35-3.96-5.02-5.73-7.88-2.12-1.13-2.37-4.46-2.58-.11.02-2.74-2.56-4.59-3.19-3.82-.01-2.64 2.76-1.32.82-3.27-.42-2.74-1.79-5.59-2.2-8.68-.64-1.49-.09-4.68-2.19-1.31-.76 3.57-.25-4.38.94-1.76 1.56-2.67-.56-2.36-.65-1.99 1.02-2.26.64-5.46-.27-4.24.54-2.39.86-8.8-.81-7.66 1.01-2.5 1.92-11.44-2.47-8.03-1.78.03-4.85.64-6.31 1.37 4.56 2.51-.46.91-2.32.51-.24 2.33-2.08 1.32-4.38 1.34 3.67.45-1.79 3.75-3.89 2.47-2.74 1.31 2.36 4.57.05 5.58.28 1.52-4.19-.55-3.84 2.96-2.65-1.12-.36 4.16.96 2.38 4.51 1.22 3.18 4.01 3.29 6.65-.74 1.54-3.63-3.62-.64-3.38-2.36-3.83-2.61-1.38-4.56.39-.45.13 4.99 2.53 1.57 3.72 3.01.47 3.1 3.1 3.71 4.76 1.81 1.88 1.44-2.08 3.6.18-1.37-2.02-7.25-5.68-2.52-4.51-.03-2.03-.86-3.67.6-3.63 1.44-2.6-1.51 6.42 1.73 3.11.9-.39 1.12-2.6 2.73.21 2.34 2.3.85 3.97-2.46 1.86.59 2.01 4.42 2.72 3.7 5.86.76 2.76 1.83 1.74 2.76 1.58.73 2.68 1.14.71 1.18-.57 3.34.72 2.56 2.69 3.6 4.07 2.3 1.04-3.29-7.04.66-2.43 4.16 3.75 1.56 5.32-2.17 4.72 2.36-.19 3.12 3.19 6.07 3.07 2.69 1.28 4.52 6.2-.12 4.15-1.61-1.45-7.31-3.24-2.65-.48 4.3 1.99 7.71 3.18 11.86 5.68 2.96 2.12 4.25 4.54 5.37 5.02-2.49 1.19-7.51-.95-3.78-1.61-2.33-.42-4.94-1.6-2.71 1.3 1.89 1.58 6.71 1.42 7.58 1.59-.73 1.61-1.99 1.74.03 1.86-2.25 1.22.72 1.41.93 2.1zm-4.6-13c-1.37-1.43-1.72-4.11-.24-1.78.75.3 2.43 4.38.24 1.78zm14.99 9.52c.85-.06.02.65 0 0zM59.59 83.91c-.06-2.17.49 1.67 0 0zM58.1 81.9c-1.73-3.32 2.17.95 0 0zM40.04 69.44c1.01-.27.5 1.73 0 0zm14.37 7.79c.62-2.33.73 1.96 0 0zm-10.15-7.06c-.71-1.29 1.5 1.21 0 0zm8.71 2.79c-1.63-3.65 1.16-2 .36.6l-.36-.6zM37.95 62.95c-.73-1.2-1.93-4.72-1.55-5.79.35 1.75 3.72 7.53 1.65 2.39-2.28-4.3 2.73 1.4 3.25 2.47.24 1.07-1.41-.29-.29 2.21-2.04-2.85-1.2 1.58-3.06-1.28zm-4.64-3.2c.19-2.79 1.06 1.91 0 0zm2.08.72c1-2.11 1.69 2.93 0 0zm-5.02-3.89c-1.73-1.72-2.98-3.3.08-1.07 1.18.05-2.62-3.6.28-1.16 3.06.56 1.51 5.01-.36 2.23zm2.64-.07c1-.99.53.98 0 0zm1.62.52c-1.52-2.85 1.85 1.2 0 0zm-3.22-3.08c-5.02-4.47 6.31 2.34.82.83l-.82-.83zm14.39 8.36c-2.18-1.3-.58-9.18.16-3.79 2.11-.68-.12 2.78 1.46 2.75-.24 2.18-.95 2.97-1.62 1.04zm5.33 3.15c.21-2.38.45 1.62 0 0zm-.93-.92c.24-1.01.03 1.2 0 0zM32.39 52.48c-3.23-4.45 9.38 4.51 2.07 1.13-.77-.21-1.69-.28-2.07-1.13zm10.26 5.43c-.31-3.75.68.62 0 0zm7.78 5c.6-2.14.05 1.41 0 0zM32.89 50.78c1.92-.41 7.95 3.37 2.41 1.08-.62-.69-1.93-.38-2.41-1.08zm16.47 8.21c.2-3.84 1.15-2.29.01.55l-.01-.55zm-15.05-9.55c.78-1.15-2.08-5.18.41-1.45 1.08.85 3.11 1.43 1.31 1.79 2.84 2.5-.68.68-1.72-.34zm14.24 8.35c.54-4.37.47 2.56 0 0zM32.68 45.41c.6-.26.32.79 0 0zm3.71 2.21c.96-2.01 1.77 2.23 0 0zm10.47 5.82c0-.77.2 1.12 0 0zm-.6-1.34c-1.45-3.59 1.35 1.9 0 0zm-.89-2.35c-.25-1.48.83 1.86 0 0zm1.45-2.36c-1-1.76 1.26-7.75 1.51-4.03-1.05 2.89-.3 4.51.43.63 1.36-3.06-.29 6.02-1.94 3.4zm1.49-8.91c.44-.53.1.65 0 0zM45.82 87.6c-.59-.52.07.33 0 0zm5.13 2.6c2.86.74 2.84-.44.26-.79-1.39-1.29-5.77-2.66-1.85-.16.27.65 1.09.63 1.59.95zm-10.14-6.74c1.57 1.18 5.93 3.32 2.24.45 1.24-1.44-2.38-2.21-1.18-3.18-3.06-1.87-2.41-1.7-.27-1.64-3.67-1.64.53-1.52.33-2.36-1.42-.28-7.03-2.5-3.73.18-3.36-1.71-.8.64-1.82.39-3.44-.94 3.06 2.62-.54 1.73 1.97 1.56 5.3 4 .83 1.65-.57.85 3.21 2.14 4.14 2.78zm5.37 3.09c6.53 2.1-3.2-2.58 0 0zm27.5 16.65c.08-1.3-.9 1.11 0 0zm2.82 1.19c1.51-1.46.06 2.33 2.5-.36.03-1.92-.07-3.06-2.8-.72-.75.42-1.09 2.19.3 1.08zM31.65 76.22c-.47-1.82-3.25-1.81 0 0zm3.01 1.98c-1.12-1.86-4-1.68 0 0zm17.17 10.35c1.68 1.49 7.7 1.09 2.03.18-.83-1.24-5.32-.94-2.03-.18zm23.6 14.57c2.57-2.16-2.5.97 0 0zm5.36 3.69c.02-.69-1.11.3 0 0zm.01-.97c2.86-3.03-2.77.18 0 0zM24.22 70.01c-2.43-3.47-1.51-5.03-3.86-7.87-.45-2.17-4.03-7.09-1.85-1.88 1.99 3.05 2.58 7.77 5.71 9.75zm55.68 34.87c5.26-3.4-2.15-1.48 0 0zm4.01 1.57c2.64-2.26-1.66-.47 0 0zM30.75 72.38c.76-1.12-1.94-.14 0 0zm52.33 32.99c2.55-1.64-.59-1.39-.46.15l.46-.15zM48.5 83.58c-.09-1.11-1.35.09 0 0zm2.14 1.23c-.69-1.38-1.05.21 0 0zm36.53 21.67c3.27-2.36-1.98-.45-.68.45l.68-.45zm-1.26-.6c2.67-2.23-2.8.99 0 0zm6.39 4.25c1.79-1.19-2.17-.38 0 0zM32.39 71.57c2.39.54 9.56 5.89 5.33.37-2.17-.64-.87-5.94-3.08-5 1.48 2.48 1.22 3.53-1.9 1.97-3.91-1.91-2.2.94-1.43 1.73-1.04.25 1.39.91 1.08.93zm-10.9-8.61c.43-1.77-3.95-9.75-2.07-4 .68 1.21.61 3.49 2.07 4zM41.5 75.3c-1.23-1.03-.06-.15 0 0zm3.03.71c0-1.88-3.35-.77 0 0zm26.3 16.57c-.5-1.28-1.98-.02 0 0zm1.26.93c-.18-.72-.72.14 0 0zm10.43 6.56c1-.74-1.25-.09 0 0zM26.93 64.35c2.87-1.11-3.07-.79 0 0zm41.59 26.2c-.04-1.86-1.83.46 0 0zM25.8 61.71c1.84-.62-1.71-.41 0 0zm5.34 2.59c-.03-.61-.56.23 0 0zm65.22 39.99c2.37-.48 7.77 1.21 8.64-.63-2.88-.07-9.95-2.03-10.28.46l.63.1 1.01.07zM32.84 64.73c.05-1.88-1.46-.07 0 0zm-14.05-9.75c-.64-3.58-2.43-.54 0 0zm3.35.84c.04-1.15-3.07-1.03 0 0zm1.91.94c-.55-.44-.43.57 0 0zm12.06 7.73c.57-.52-1.35-.38 0 0zm-13.33-9.85c-.33-2.71-3.88-.4 0 0zm-6.87-4.46c-.1-1.25-.67.47 0 0zm1.02-.77c-.17-1.48-.88.19 0 0zm5.65 3.37c2.39-.94-4.35-1.94-.49-.18l.49.18zm75.59 46.69c1.53-1.4-1.94-.43 0 0zm9.13 4.74c.61-1.81-1.54.23 0 0zM23.15 49.82c.26-1.75-1.89.35 0 0zm-8.03-5.38c-.43-2.47-.37-6.82 3.76-5.35-5.51 1.1 3.82 6.85 2.64 2.31 2.32.11 4.53-1.37 3.32.88 4.57-.5 7.73-4.46 12.14-3.91 3.44-.46 7.19-.8 10.89-2.18 3.04-.22 5.97-3.5 4.31-5.44-4.15-.35-8.5.17-13.08 1.08-5.08 1.06-9.7 3.06-14.83 3.93-5 .67 1 1.85-.43 2.11-2.61.9 3.11 1.52-.34 2.47-2.13-.41-4.35-1.14-3.44-3.38-4.79.62-9 2.61-5.21 7.48h.27zm11.54-5.88c1.12-4.14 6.01 3.4 1.84.55-.5-.38-1.32-.68-1.84-.55zm.22-2.01c1.62-1.2.86.68 0 0zm2.06.04c.15-1.9 4.71 1.01.75.68l-.75-.68zm2.81-1.14c1.03-1.2.3 1.07 0 0zm.72-.48c1.71-2.06 9.69-1.31 3.85-.2-1.56-1.18-2.76.7-3.85.2zm10.42-1.6c-.26-5.62 5.18 1.99 0 0zm2.96-.02c1.08-2.83 4.2-1.14.5-.57.08.3-.11 1.46-.5.57zM21.99 48.37c3.23-1.98-3.43-1.72 0 0zm2.39.66c1.13-1.2-2.46-.49 0 0zm-7.04-4.99c1.85-1.42-2.18-.54 0 0zm95.35 59.65c.05-1.65-1.41.74 0 0zM103 97.08c.28-1.9-1.24.16 0 0zm12.36 7.25c2.58.01 7.82-.8 2.2-.8-.88.13-5.13.11-2.2.8zM26.48 47.87c2.09-.14 3.27-2.3-.41-2.18-5.69-.59 5.02 1.95-.73 1.22-.77.51 1.09 1.1 1.14.96zm1.84.93c-.22-1.34-.65.71 0 0zm2.18-5.82c.9-1.12-1.26-.3 0 0zm-6.95-11.6c3.73-1.27 8.82-2.69 10.58.62-1.79-2.15-.72-4.28.97-1.12 2.39 3.19 3.59-1.45 2.03-2.52 1.77 2.2 3.79 3.24 1.19.14 2.83-3.4-5.66.45-7.59.41-.92.41-9.58 2.2-7.18 2.47zm2.19-4.18c2.13-1.6 7.35.96 4-1.59-.33-.3-7.35 1.93-4 1.59zm7.75.32c2.49.06-1.07-3.34 1.89-1.8-.49-1.59-3.45-1.89-4.9-2.52-.82 1.45 1.66 4.34 3.01 4.32zm-6.39-7.04c.86-1.16-1.51.6 0 0zm3.16.76c4.01-.53-1.02-1.72-.81-.04l.81.04zm-5.91-4.62c-2.82-3.69 5.31.62 2.44-3.24-2.41-1.92-4.73 2.16-2.44 3.24zm36.21 19.5c1.29-2.29-5.34-3.09-.87-.81.42.14.32.97.87.81z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill-rule="evenodd" clip-rule="evenodd" fill="#439934" d="M88.038 42.812c1.605 4.643 2.761 9.383 3.141 14.296.472 6.095.256 12.147-1.029 18.142-.035.165-.109.32-.164.48-.403.001-.814-.049-1.208.012-3.329.523-6.655 1.065-9.981 1.604-3.438.557-6.881 1.092-10.313 1.687-1.216.21-2.721-.041-3.212 1.641-.014.046-.154.054-.235.08l.166-10.051-.169-24.252 1.602-.275c2.62-.429 5.24-.864 7.862-1.281 3.129-.497 6.261-.98 9.392-1.465 1.381-.215 2.764-.412 4.148-.618z"/><path fill-rule="evenodd" clip-rule="evenodd" fill="#45A538" d="M61.729 110.054c-1.69-1.453-3.439-2.842-5.059-4.37-8.717-8.222-15.093-17.899-18.233-29.566-.865-3.211-1.442-6.474-1.627-9.792-.13-2.322-.318-4.665-.154-6.975.437-6.144 1.325-12.229 3.127-18.147l.099-.138c.175.233.427.439.516.702 1.759 5.18 3.505 10.364 5.242 15.551 5.458 16.3 10.909 32.604 16.376 48.9.107.318.384.579.583.866l-.87 2.969z"/><path fill-rule="evenodd" clip-rule="evenodd" fill="#46A037" d="M88.038 42.812c-1.384.206-2.768.403-4.149.616-3.131.485-6.263.968-9.392 1.465-2.622.417-5.242.852-7.862 1.281l-1.602.275-.012-1.045c-.053-.859-.144-1.717-.154-2.576-.069-5.478-.112-10.956-.18-16.434-.042-3.429-.105-6.857-.175-10.285-.043-2.13-.089-4.261-.185-6.388-.052-1.143-.236-2.28-.311-3.423-.042-.657.016-1.319.029-1.979.817 1.583 1.616 3.178 2.456 4.749 1.327 2.484 3.441 4.314 5.344 6.311 7.523 7.892 12.864 17.068 16.193 27.433z"/><path fill-rule="evenodd" clip-rule="evenodd" fill="#409433" d="M65.036 80.753c.081-.026.222-.034.235-.08.491-1.682 1.996-1.431 3.212-1.641 3.432-.594 6.875-1.13 10.313-1.687 3.326-.539 6.652-1.081 9.981-1.604.394-.062.805-.011 1.208-.012-.622 2.22-1.112 4.488-1.901 6.647-.896 2.449-1.98 4.839-3.131 7.182a49.142 49.142 0 01-6.353 9.763c-1.919 2.308-4.058 4.441-6.202 6.548-1.185 1.165-2.582 2.114-3.882 3.161l-.337-.23-1.214-1.038-1.256-2.753a41.402 41.402 0 01-1.394-9.838l.023-.561.171-2.426c.057-.828.133-1.655.168-2.485.129-2.982.241-5.964.359-8.946z"/><path fill-rule="evenodd" clip-rule="evenodd" fill="#4FAA41" d="M65.036 80.753c-.118 2.982-.23 5.964-.357 8.947-.035.83-.111 1.657-.168 2.485l-.765.289c-1.699-5.002-3.399-9.951-5.062-14.913-2.75-8.209-5.467-16.431-8.213-24.642a4498.887 4498.887 0 00-6.7-19.867c-.105-.31-.407-.552-.617-.826l4.896-9.002c.168.292.39.565.496.879a6167.476 6167.476 0 016.768 20.118c2.916 8.73 5.814 17.467 8.728 26.198.116.349.308.671.491 1.062l.67-.78-.167 10.052z"/><path fill-rule="evenodd" clip-rule="evenodd" fill="#4AA73C" d="M43.155 32.227c.21.274.511.516.617.826a4498.887 4498.887 0 016.7 19.867c2.746 8.211 5.463 16.433 8.213 24.642 1.662 4.961 3.362 9.911 5.062 14.913l.765-.289-.171 2.426-.155.559c-.266 2.656-.49 5.318-.814 7.968-.163 1.328-.509 2.632-.772 3.947-.198-.287-.476-.548-.583-.866-5.467-16.297-10.918-32.6-16.376-48.9a3888.972 3888.972 0 00-5.242-15.551c-.089-.263-.34-.469-.516-.702l3.272-8.84z"/><path fill-rule="evenodd" clip-rule="evenodd" fill="#57AE47" d="M65.202 70.702l-.67.78c-.183-.391-.375-.714-.491-1.062-2.913-8.731-5.812-17.468-8.728-26.198a6167.476 6167.476 0 00-6.768-20.118c-.105-.314-.327-.588-.496-.879l6.055-7.965c.191.255.463.482.562.769 1.681 4.921 3.347 9.848 5.003 14.778 1.547 4.604 3.071 9.215 4.636 13.813.105.308.47.526.714.786l.012 1.045c.058 8.082.115 16.167.171 24.251z"/><path fill-rule="evenodd" clip-rule="evenodd" fill="#60B24F" d="M65.021 45.404c-.244-.26-.609-.478-.714-.786-1.565-4.598-3.089-9.209-4.636-13.813-1.656-4.93-3.322-9.856-5.003-14.778-.099-.287-.371-.514-.562-.769 1.969-1.928 3.877-3.925 5.925-5.764 1.821-1.634 3.285-3.386 3.352-5.968.003-.107.059-.214.145-.514l.519 1.306c-.013.661-.072 1.322-.029 1.979.075 1.143.259 2.28.311 3.423.096 2.127.142 4.258.185 6.388.069 3.428.132 6.856.175 10.285.067 5.478.111 10.956.18 16.434.008.861.098 1.718.152 2.577z"/><path fill-rule="evenodd" clip-rule="evenodd" fill="#A9AA88" d="M62.598 107.085c.263-1.315.609-2.62.772-3.947.325-2.649.548-5.312.814-7.968l.066-.01.066.011a41.402 41.402 0 001.394 9.838c-.176.232-.425.439-.518.701-.727 2.05-1.412 4.116-2.143 6.166-.1.28-.378.498-.574.744l-.747-2.566.87-2.969z"/><path fill-rule="evenodd" clip-rule="evenodd" fill="#B6B598" d="M62.476 112.621c.196-.246.475-.464.574-.744.731-2.05 1.417-4.115 2.143-6.166.093-.262.341-.469.518-.701l1.255 2.754c-.248.352-.59.669-.728 1.061l-2.404 7.059c-.099.283-.437.483-.663.722l-.695-3.985z"/><path fill-rule="evenodd" clip-rule="evenodd" fill="#C2C1A7" d="M63.171 116.605c.227-.238.564-.439.663-.722l2.404-7.059c.137-.391.48-.709.728-1.061l1.215 1.037c-.587.58-.913 1.25-.717 2.097l-.369 1.208c-.168.207-.411.387-.494.624-.839 2.403-1.64 4.819-2.485 7.222-.107.305-.404.544-.614.812-.109-1.387-.22-2.771-.331-4.158z"/><path fill-rule="evenodd" clip-rule="evenodd" fill="#CECDB7" d="M63.503 120.763c.209-.269.506-.508.614-.812.845-2.402 1.646-4.818 2.485-7.222.083-.236.325-.417.494-.624l-.509 5.545c-.136.157-.333.294-.398.477-.575 1.614-1.117 3.24-1.694 4.854-.119.333-.347.627-.525.938-.158-.207-.441-.407-.454-.623-.051-.841-.016-1.688-.013-2.533z"/><path fill-rule="evenodd" clip-rule="evenodd" fill="#DBDAC7" d="M63.969 123.919c.178-.312.406-.606.525-.938.578-1.613 1.119-3.239 1.694-4.854.065-.183.263-.319.398-.477l.012 3.64-1.218 3.124-1.411-.495z"/><path fill-rule="evenodd" clip-rule="evenodd" fill="#EBE9DC" d="M65.38 124.415l1.218-3.124.251 3.696-1.469-.572z"/><path fill-rule="evenodd" clip-rule="evenodd" fill="#CECDB7" d="M67.464 110.898c-.196-.847.129-1.518.717-2.097l.337.23-1.054 1.867z"/><path fill-rule="evenodd" clip-rule="evenodd" fill="#4FAA41" d="M64.316 95.172l-.066-.011-.066.01.155-.559-.023.56z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#00618A" d="M116.948 97.807c-6.863-.187-12.104.452-16.585 2.341-1.273.537-3.305.552-3.513 2.147.7.733.809 1.829 1.365 2.731 1.07 1.73 2.876 4.052 4.488 5.268 1.762 1.33 3.577 2.751 5.465 3.902 3.358 2.047 7.107 3.217 10.34 5.268 1.906 1.21 3.799 2.733 5.658 4.097.92.675 1.537 1.724 2.732 2.147v-.194c-.628-.8-.79-1.898-1.366-2.733l-2.537-2.537c-2.48-3.292-5.629-6.184-8.976-8.585-2.669-1.916-8.642-4.504-9.755-7.609l-.195-.195c1.892-.214 4.107-.898 5.854-1.367 2.934-.786 5.556-.583 8.585-1.365l4.097-1.171v-.78c-1.531-1.571-2.623-3.651-4.292-5.073-4.37-3.72-9.138-7.437-14.048-10.537-2.724-1.718-6.089-2.835-8.976-4.292-.971-.491-2.677-.746-3.318-1.562-1.517-1.932-2.342-4.382-3.511-6.633-2.449-4.717-4.854-9.868-7.024-14.831-1.48-3.384-2.447-6.72-4.293-9.756-8.86-14.567-18.396-23.358-33.169-32-3.144-1.838-6.929-2.563-10.929-3.513-2.145-.129-4.292-.26-6.438-.391-1.311-.546-2.673-2.149-3.902-2.927C17.811 4.565 5.257-2.16 1.633 6.682c-2.289 5.581 3.421 11.025 5.462 13.854 1.434 1.982 3.269 4.207 4.293 6.438.674 1.467.79 2.938 1.367 4.489 1.417 3.822 2.652 7.98 4.487 11.511.927 1.788 1.949 3.67 3.122 5.268.718.981 1.951 1.413 2.145 2.927-1.204 1.686-1.273 4.304-1.95 6.44-3.05 9.615-1.899 21.567 2.537 28.683 1.36 2.186 4.567 6.871 8.975 5.073 3.856-1.57 2.995-6.438 4.098-10.732.249-.973.096-1.689.585-2.341v.195l3.513 7.024c2.6 4.187 7.212 8.562 11.122 11.514 2.027 1.531 3.623 4.177 6.244 5.073v-.196h-.195c-.508-.791-1.303-1.119-1.951-1.755-1.527-1.497-3.225-3.358-4.487-5.073-3.556-4.827-6.698-10.11-9.561-15.609-1.368-2.627-2.557-5.523-3.709-8.196-.444-1.03-.438-2.589-1.364-3.122-1.263 1.958-3.122 3.542-4.098 5.854-1.561 3.696-1.762 8.204-2.341 12.878-.342.122-.19.038-.391.194-2.718-.655-3.672-3.452-4.683-5.853-2.554-6.07-3.029-15.842-.781-22.829.582-1.809 3.21-7.501 2.146-9.172-.508-1.666-2.184-2.63-3.121-3.903-1.161-1.574-2.319-3.646-3.124-5.464-2.09-4.731-3.066-10.044-5.267-14.828-1.053-2.287-2.832-4.602-4.293-6.634-1.617-2.253-3.429-3.912-4.683-6.635-.446-.968-1.051-2.518-.391-3.513.21-.671.508-.951 1.171-1.17 1.132-.873 4.284.29 5.462.779 3.129 1.3 5.741 2.538 8.392 4.294 1.271.844 2.559 2.475 4.097 2.927h1.756c2.747.631 5.824.195 8.391.975 4.536 1.378 8.601 3.523 12.292 5.854 11.246 7.102 20.442 17.21 26.732 29.269 1.012 1.942 1.45 3.794 2.341 5.854 1.798 4.153 4.063 8.426 5.852 12.488 1.786 4.052 3.526 8.141 6.05 11.513 1.327 1.772 6.451 2.723 8.781 3.708 1.632.689 4.307 1.409 5.854 2.34 2.953 1.782 5.815 3.903 8.586 5.855 1.383.975 5.64 3.116 5.852 4.879zM29.729 23.466c-1.431-.027-2.443.156-3.513.389v.195h.195c.683 1.402 1.888 2.306 2.731 3.513.65 1.367 1.301 2.732 1.952 4.097l.194-.193c1.209-.853 1.762-2.214 1.755-4.294-.484-.509-.555-1.147-.975-1.755-.556-.811-1.635-1.272-2.339-1.952z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#83CD29" d="M112.771 30.334L68.674 4.729c-2.781-1.584-6.402-1.584-9.205 0L14.901 30.334C12.031 31.985 10 35.088 10 38.407v51.142c0 3.319 2.084 6.423 4.954 8.083l11.775 6.688c5.628 2.772 7.617 2.772 10.178 2.772 8.333 0 13.093-5.039 13.093-13.828v-50.49c0-.713-.371-1.774-1.071-1.774h-5.623C42.594 41 41 42.061 41 42.773v50.49c0 3.896-3.524 7.773-10.11 4.48L18.723 90.73c-.424-.23-.723-.693-.723-1.181V38.407c0-.482.555-.966.982-1.213l44.424-25.561c.415-.235 1.025-.235 1.439 0l43.882 25.555c.42.253.272.722.272 1.219v51.142c0 .488.183.963-.232 1.198l-44.086 25.576c-.378.227-.847.227-1.261 0l-11.307-6.749c-.341-.198-.746-.269-1.073-.086-3.146 1.783-3.726 2.02-6.677 3.043-.726.253-1.797.692.41 1.929l14.798 8.754a9.294 9.294 0 004.647 1.246c1.642 0 3.25-.426 4.667-1.246l43.885-25.582c2.87-1.672 4.23-4.764 4.23-8.083V38.407c0-3.319-1.36-6.414-4.229-8.073zM77.91 81.445c-11.726 0-14.309-3.235-15.17-9.066-.1-.628-.633-1.379-1.272-1.379h-5.731c-.709 0-1.279.86-1.279 1.566 0 7.466 4.059 16.512 23.453 16.512 14.039 0 22.088-5.455 22.088-15.109 0-9.572-6.467-12.084-20.082-13.886-13.762-1.819-15.16-2.738-15.16-5.962 0-2.658 1.184-6.203 11.374-6.203 9.105 0 12.461 1.954 13.842 8.091.118.577.645.991 1.24.991h5.754c.354 0 .692-.143.94-.396.24-.272.367-.613.335-.979-.891-10.568-7.912-15.493-22.112-15.493-12.631 0-20.166 5.334-20.166 14.275 0 9.698 7.497 12.378 19.622 13.577 14.505 1.422 15.633 3.542 15.633 6.395 0 4.955-3.978 7.066-13.309 7.066z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path d="M93.809 92.112c.785-6.533.55-7.492 5.416-6.433l1.235.108c3.742.17 8.637-.602 11.513-1.938 6.191-2.873 9.861-7.668 3.758-6.409-13.924 2.873-14.881-1.842-14.881-1.842 14.703-21.815 20.849-49.508 15.543-56.287-14.47-18.489-39.517-9.746-39.936-9.52l-.134.025c-2.751-.571-5.83-.912-9.289-.968-6.301-.104-11.082 1.652-14.709 4.402 0 0-44.683-18.409-42.604 23.151.442 8.841 12.672 66.898 27.26 49.362 5.332-6.412 10.484-11.834 10.484-11.834 2.558 1.699 5.622 2.567 8.834 2.255l.249-.212c-.078.796-.044 1.575.099 2.497-3.757 4.199-2.653 4.936-10.166 6.482-7.602 1.566-3.136 4.355-.221 5.084 3.535.884 11.712 2.136 17.238-5.598l-.22.882c1.474 1.18 1.375 8.477 1.583 13.69.209 5.214.558 10.079 1.621 12.948 1.063 2.868 2.317 10.256 12.191 8.14 8.252-1.764 14.561-4.309 15.136-27.985"/><path d="M75.458 125.256c-4.367 0-7.211-1.689-8.938-3.32-2.607-2.46-3.641-5.629-4.259-7.522l-.267-.79c-1.244-3.358-1.666-8.193-1.916-14.419-.038-.935-.064-1.898-.093-2.919-.021-.747-.047-1.684-.085-2.664a18.8 18.8 0 01-4.962 1.568c-3.079.526-6.389.356-9.84-.507-2.435-.609-4.965-1.871-6.407-3.82-4.203 3.681-8.212 3.182-10.396 2.453-3.853-1.285-7.301-4.896-10.542-11.037-2.309-4.375-4.542-10.075-6.638-16.943-3.65-11.96-5.969-24.557-6.175-28.693C4.292 23.698 7.777 14.44 15.296 9.129 27.157.751 45.128 5.678 51.68 7.915c4.402-2.653 9.581-3.944 15.433-3.851 3.143.051 6.136.327 8.916.823 2.9-.912 8.628-2.221 15.185-2.139 12.081.144 22.092 4.852 28.949 13.615 4.894 6.252 2.474 19.381.597 26.651-2.642 10.226-7.271 21.102-12.957 30.57 1.544.011 3.781-.174 6.961-.831 6.274-1.295 8.109 2.069 8.607 3.575 1.995 6.042-6.677 10.608-9.382 11.864-3.466 1.609-9.117 2.589-13.745 2.377l-.202-.013-1.216-.107-.12 1.014-.116.991c-.311 11.999-2.025 19.598-5.552 24.619-3.697 5.264-8.835 6.739-13.361 7.709-1.544.33-2.947.474-4.219.474zm-9.19-43.671c2.819 2.256 3.066 6.501 3.287 14.434.028.99.054 1.927.089 2.802.106 2.65.355 8.855 1.327 11.477.137.371.26.747.39 1.146 1.083 3.316 1.626 4.979 6.309 3.978 3.931-.843 5.952-1.599 7.534-3.851 2.299-3.274 3.585-9.86 3.821-19.575l4.783.116-4.75-.57.14-1.186c.455-3.91.783-6.734 3.396-8.602 2.097-1.498 4.486-1.353 6.389-1.01-2.091-1.58-2.669-3.433-2.823-4.193l-.399-1.965 1.121-1.663c6.457-9.58 11.781-21.354 14.609-32.304 2.906-11.251 2.02-17.226 1.134-18.356-11.729-14.987-32.068-8.799-34.192-8.097l-.359.194-1.8.335-.922-.191c-2.542-.528-5.366-.82-8.393-.869-4.756-.08-8.593 1.044-11.739 3.431l-2.183 1.655-2.533-1.043c-5.412-2.213-21.308-6.662-29.696-.721-4.656 3.298-6.777 9.76-6.305 19.207.156 3.119 2.275 14.926 5.771 26.377 4.831 15.825 9.221 21.082 11.054 21.693.32.108 1.15-.537 1.976-1.529a270.708 270.708 0 0110.694-12.07l2.77-2.915 3.349 2.225c1.35.897 2.839 1.406 4.368 1.502l7.987-6.812-1.157 11.808c-.026.265-.039.626.065 1.296l.348 2.238-1.51 1.688-.174.196 4.388 2.025 1.836-2.301z"/><path fill="#336791" d="M115.731 77.44c-13.925 2.873-14.882-1.842-14.882-1.842 14.703-21.816 20.849-49.51 15.545-56.287C101.924.823 76.875 9.566 76.457 9.793l-.135.024c-2.751-.571-5.83-.911-9.291-.967-6.301-.103-11.08 1.652-14.707 4.402 0 0-44.684-18.408-42.606 23.151.442 8.842 12.672 66.899 27.26 49.363 5.332-6.412 10.483-11.834 10.483-11.834 2.559 1.699 5.622 2.567 8.833 2.255l.25-.212c-.078.796-.042 1.575.1 2.497-3.758 4.199-2.654 4.936-10.167 6.482-7.602 1.566-3.136 4.355-.22 5.084 3.534.884 11.712 2.136 17.237-5.598l-.221.882c1.473 1.18 2.507 7.672 2.334 13.557-.174 5.885-.29 9.926.871 13.082 1.16 3.156 2.316 10.256 12.192 8.14 8.252-1.768 12.528-6.351 13.124-13.995.422-5.435 1.377-4.631 1.438-9.49l.767-2.3c.884-7.367.14-9.743 5.225-8.638l1.235.108c3.742.17 8.639-.602 11.514-1.938 6.19-2.871 9.861-7.667 3.758-6.408z"/><path fill="#fff" d="M75.957 122.307c-8.232 0-10.84-6.519-11.907-9.185-1.562-3.907-1.899-19.069-1.551-31.503a1.59 1.59 0 011.64-1.55 1.594 1.594 0 011.55 1.639c-.401 14.341.168 27.337 1.324 30.229 1.804 4.509 4.54 8.453 12.275 6.796 7.343-1.575 10.093-4.359 11.318-11.46.94-5.449 2.799-20.951 3.028-24.01a1.593 1.593 0 011.71-1.472 1.597 1.597 0 011.472 1.71c-.239 3.185-2.089 18.657-3.065 24.315-1.446 8.387-5.185 12.191-13.794 14.037-1.463.313-2.792.453-4 .454zM31.321 90.466a6.71 6.71 0 01-2.116-.35c-5.347-1.784-10.44-10.492-15.138-25.885-3.576-11.717-5.842-23.947-6.041-27.922-.589-11.784 2.445-20.121 9.02-24.778 13.007-9.216 34.888-.44 35.813-.062a1.596 1.596 0 01-1.207 2.955c-.211-.086-21.193-8.492-32.768-.285-5.622 3.986-8.203 11.392-7.672 22.011.167 3.349 2.284 15.285 5.906 27.149 4.194 13.742 8.967 22.413 13.096 23.79.648.216 2.62.873 5.439-2.517A245.272 245.272 0 0145.88 73.046a1.596 1.596 0 012.304 2.208c-.048.05-4.847 5.067-10.077 11.359-2.477 2.979-4.851 3.853-6.786 3.853zm69.429-13.445a1.596 1.596 0 01-1.322-2.487c14.863-22.055 20.08-48.704 15.612-54.414-5.624-7.186-13.565-10.939-23.604-11.156-7.433-.16-13.341 1.738-14.307 2.069l-.243.099c-.971.305-1.716-.227-1.997-.849a1.6 1.6 0 01.631-2.025c.046-.027.192-.089.429-.176l-.021.006.021-.007c1.641-.601 7.639-2.4 15.068-2.315 11.108.118 20.284 4.401 26.534 12.388 2.957 3.779 2.964 12.485.019 23.887-3.002 11.625-8.651 24.118-15.497 34.277-.306.457-.81.703-1.323.703zm.76 10.21c-2.538 0-4.813-.358-6.175-1.174-1.4-.839-1.667-1.979-1.702-2.584-.382-6.71 3.32-7.878 5.208-8.411-.263-.398-.637-.866-1.024-1.349-1.101-1.376-2.609-3.26-3.771-6.078-.182-.44-.752-1.463-1.412-2.648-3.579-6.418-11.026-19.773-6.242-26.612 2.214-3.165 6.623-4.411 13.119-3.716C97.6 28.837 88.5 10.625 66.907 10.271c-6.494-.108-11.82 1.889-15.822 5.93-8.96 9.049-8.636 25.422-8.631 25.586a1.595 1.595 0 11-3.19.084c-.02-.727-.354-17.909 9.554-27.916C53.455 9.272 59.559 6.96 66.96 7.081c13.814.227 22.706 7.25 27.732 13.101 5.479 6.377 8.165 13.411 8.386 15.759.165 1.746-1.088 2.095-1.341 2.147l-.576.013c-6.375-1.021-10.465-.312-12.156 2.104-3.639 5.201 3.406 17.834 6.414 23.229.768 1.376 1.322 2.371 1.576 2.985.988 2.396 2.277 4.006 3.312 5.3.911 1.138 1.7 2.125 1.982 3.283.131.23 1.99 2.98 13.021.703 2.765-.57 4.423-.083 4.93 1.45.997 3.015-4.597 6.532-7.694 7.97-2.775 1.29-7.204 2.106-11.036 2.106zm-4.696-4.021c.35.353 2.101.962 5.727.806 3.224-.138 6.624-.839 8.664-1.786 2.609-1.212 4.351-2.567 5.253-3.492l-.5.092c-7.053 1.456-12.042 1.262-14.828-.577a6.162 6.162 0 01-.54-.401c-.302.119-.581.197-.78.253-1.58.443-3.214.902-2.996 5.105zm-45.562 8.915c-1.752 0-3.596-.239-5.479-.71-1.951-.488-5.24-1.957-5.19-4.37.057-2.707 3.994-3.519 5.476-3.824 5.354-1.103 5.703-1.545 7.376-3.67.488-.619 1.095-1.39 1.923-2.314 1.229-1.376 2.572-2.073 3.992-2.073.989 0 1.8.335 2.336.558 1.708.708 3.133 2.42 3.719 4.467.529 1.847.276 3.625-.71 5.006-3.237 4.533-7.886 6.93-13.443 6.93zm-7.222-4.943c.481.372 1.445.869 2.518 1.137 1.631.408 3.213.615 4.705.615 4.546 0 8.196-1.882 10.847-5.594.553-.774.387-1.757.239-2.274-.31-1.083-1.08-2.068-1.873-2.397-.43-.178-.787-.314-1.115-.314-.176 0-.712 0-1.614 1.009a41.146 41.146 0 00-1.794 2.162c-2.084 2.646-3.039 3.544-9.239 4.821-1.513.31-2.289.626-2.674.835zm12.269-7.36a1.596 1.596 0 01-1.575-1.354 8.218 8.218 0 01-.08-.799c-4.064-.076-7.985-1.82-10.962-4.926-3.764-3.927-5.477-9.368-4.699-14.927.845-6.037.529-11.366.359-14.229-.047-.796-.081-1.371-.079-1.769.003-.505.013-1.844 4.489-4.113 1.592-.807 4.784-2.215 8.271-2.576 5.777-.597 9.585 1.976 10.725 7.246 3.077 14.228.244 20.521-1.825 25.117-.385.856-.749 1.664-1.04 2.447l-.257.69c-1.093 2.931-2.038 5.463-1.748 7.354a1.595 1.595 0 01-1.335 1.819l-.244.02zM42.464 42.26l.062 1.139c.176 2.974.504 8.508-.384 14.86-.641 4.585.759 9.06 3.843 12.276 2.437 2.542 5.644 3.945 8.94 3.945h.068c.369-1.555.982-3.197 1.642-4.966l.255-.686c.329-.884.714-1.74 1.122-2.646 1.991-4.424 4.47-9.931 1.615-23.132-.565-2.615-1.936-4.128-4.189-4.627-4.628-1.022-11.525 2.459-12.974 3.837zm9.63-.677c-.08.564 1.033 2.07 2.485 2.271 1.449.203 2.689-.975 2.768-1.539.079-.564-1.033-1.186-2.485-1.388-1.451-.202-2.691.092-2.768.656zm2.818 2.826l-.407-.028c-.9-.125-1.81-.692-2.433-1.518-.219-.29-.576-.852-.505-1.354.101-.736.999-1.177 2.4-1.177.313 0 .639.023.967.069.766.106 1.477.327 2.002.62.91.508.977 1.075.936 1.368-.112.813-1.405 2.02-2.96 2.02zm-2.289-2.732c.045.348.907 1.496 2.029 1.651l.261.018c1.036 0 1.81-.815 1.901-1.082-.096-.182-.762-.634-2.025-.81a5.823 5.823 0 00-.821-.059c-.812 0-1.243.183-1.345.282zm43.605-1.245c.079.564-1.033 2.07-2.484 2.272-1.45.202-2.691-.975-2.771-1.539-.076-.564 1.036-1.187 2.486-1.388 1.45-.203 2.689.092 2.769.655zm-2.819 2.56c-1.396 0-2.601-1.086-2.7-1.791-.115-.846 1.278-1.489 2.712-1.688.316-.044.629-.066.93-.066 1.238 0 2.058.363 2.14.949.053.379-.238.964-.739 1.492-.331.347-1.026.948-1.973 1.079l-.37.025zm.943-3.013c-.276 0-.564.021-.856.061-1.441.201-2.301.779-2.259 1.089.048.341.968 1.332 2.173 1.332l.297-.021c.787-.109 1.378-.623 1.66-.919.443-.465.619-.903.598-1.052-.028-.198-.56-.49-1.613-.49zm3.965 32.843a1.594 1.594 0 01-1.324-2.483c3.398-5.075 2.776-10.25 2.175-15.255-.257-2.132-.521-4.337-.453-6.453.07-2.177.347-3.973.614-5.71.317-2.058.617-4.002.493-6.31a1.595 1.595 0 113.186-.172c.142 2.638-.197 4.838-.525 6.967-.253 1.643-.515 3.342-.578 5.327-.061 1.874.178 3.864.431 5.97.64 5.322 1.365 11.354-2.691 17.411a1.596 1.596 0 01-1.328.708z"/></svg>
@@ -0,0 +1 @@
1
+ MONGO_URI=mongodb+srv://username:password@cluster.mongodb.net/dbname?retryWrites=true&w=majority
@@ -0,0 +1,26 @@
1
+ from motor.motor_asyncio import AsyncIOMotorClient
2
+ from dotenv import load_dotenv
3
+ import os
4
+
5
+ load_dotenv()
6
+
7
+ # MongoDB connection via environment variables
8
+ MONGO_USER = os.getenv("MONGO_USER", "")
9
+ MONGO_PASSWORD = os.getenv("MONGO_PASSWORD", "")
10
+ MONGO_HOST = os.getenv("MONGO_HOST", "localhost")
11
+ MONGO_PORT = os.getenv("MONGO_PORT", "27017")
12
+ MONGO_DB = os.getenv("MONGO_DB", "example_db")
13
+
14
+ if MONGO_USER and MONGO_PASSWORD:
15
+ MONGO_URI = f"mongodb://{MONGO_USER}:{MONGO_PASSWORD}@{MONGO_HOST}:{MONGO_PORT}"
16
+ else:
17
+ MONGO_URI = f"mongodb://{MONGO_HOST}:{MONGO_PORT}"
18
+
19
+ client = AsyncIOMotorClient(MONGO_URI)
20
+ database = client[MONGO_DB]
21
+
22
+ users_collection = database.get_collection("users")
23
+ notes_collection = database.get_collection("notes")
24
+
25
+ async def get_database():
26
+ return database
@@ -0,0 +1,32 @@
1
+ from fastapi import FastAPI, HTTPException, status
2
+ from fastapi.middleware.cors import CORSMiddleware
3
+ from contextlib import asynccontextmanager
4
+ from config import engine, Base
5
+ from routes import router
6
+
7
+ @asynccontextmanager
8
+ async def lifespan(app: FastAPI):
9
+ Base.metadata.create_all(bind=engine)
10
+ yield
11
+
12
+ app = FastAPI(
13
+ title="AutoStack API",
14
+ description="Full-stack API built with FastAPI and MySQL",
15
+ version="1.0.0",
16
+ lifespan=lifespan
17
+ )
18
+
19
+ # CORS middleware
20
+ app.add_middleware(
21
+ CORSMiddleware,
22
+ allow_origins=["*"], # Adjust this in production
23
+ allow_credentials=True,
24
+ allow_methods=["*"],
25
+ allow_headers=["*"],
26
+ )
27
+
28
+ app.include_router(router)
29
+
30
+ if __name__ == "__main__":
31
+ import uvicorn
32
+ uvicorn.run("main:app", host="0.0.0.0", port=5000, reload=True)
@@ -0,0 +1,56 @@
1
+ from pydantic import BaseModel, Field, EmailStr
2
+ from typing import Optional
3
+ from bson import ObjectId
4
+
5
+ class PyObjectId(ObjectId):
6
+ @classmethod
7
+ def __get_validators__(cls):
8
+ yield cls.validate
9
+
10
+ @classmethod
11
+ def validate(cls, v):
12
+ if not ObjectId.is_valid(v):
13
+ raise ValueError("Invalid ObjectId")
14
+ return ObjectId(v)
15
+
16
+ @classmethod
17
+ def __modify_schema__(cls, field_schema):
18
+ field_schema.update(type="string")
19
+
20
+
21
+ # User Model
22
+ class UserModel(BaseModel):
23
+ id: Optional[PyObjectId] = Field(alias="_id", default=None)
24
+ username: str
25
+ email: EmailStr
26
+
27
+ class Config:
28
+ populate_by_name = True
29
+ arbitrary_types_allowed = True
30
+ json_encoders = {ObjectId: str}
31
+
32
+ def to_json(self):
33
+ return {
34
+ "id": str(self.id) if self.id else None,
35
+ "username": self.username,
36
+ "email": self.email
37
+ }
38
+
39
+
40
+ # Note Model
41
+ class NoteModel(BaseModel):
42
+ id: Optional[PyObjectId] = Field(alias="_id", default=None)
43
+ title: str
44
+ content: str
45
+
46
+ class Config:
47
+ populate_by_name = True
48
+ arbitrary_types_allowed = True
49
+ json_encoders = {ObjectId: str}
50
+
51
+ def to_json(self):
52
+ return {
53
+ "id": str(self.id) if self.id else None,
54
+ "title": self.title,
55
+ "content": self.content
56
+ }
@@ -0,0 +1,6 @@
1
+ fastapi==0.109.0
2
+ uvicorn[standard]==0.27.0
3
+ motor==3.3.2
4
+ pydantic[email]==2.5.3
5
+ python-dotenv==1.0.0
6
+ pymongo==4.6.1
@@ -0,0 +1,189 @@
1
+ from fastapi import APIRouter, HTTPException, status
2
+ from typing import List
3
+ from bson import ObjectId
4
+ from config import users_collection, notes_collection
5
+ from schemas import (
6
+ UserCreate, UserUpdate, UserResponse,
7
+ NoteCreate, NoteUpdate, NoteResponse
8
+ )
9
+
10
+ router = APIRouter()
11
+
12
+ # Convert ObjectId to string
13
+ def serialize_doc(doc):
14
+ if doc and "_id" in doc:
15
+ doc["id"] = str(doc["_id"])
16
+ del doc["_id"]
17
+ return doc
18
+
19
+ @router.get("/", status_code=status.HTTP_200_OK)
20
+ async def autostack():
21
+ message = """
22
+ Congrats! You have successfully set up your full-stack project!
23
+ If you're reading this message, it means your frontend and backend are completely connected!
24
+ You are ready to create your next big project!
25
+ """
26
+ return {"message": message, "backend": "FastAPI", "database": "MongoDB", "filepath": 'backend/main.py'}
27
+
28
+ # Example User REST APIs
29
+ @router.get("/get-users", status_code=status.HTTP_200_OK)
30
+ async def get_users():
31
+ users = []
32
+ async for user in users_collection.find():
33
+ users.append(serialize_doc(user))
34
+ return {"users": users}
35
+
36
+
37
+ @router.post("/create-user", status_code=status.HTTP_201_CREATED)
38
+ async def create_user(user: UserCreate):
39
+ existing = await users_collection.find_one({
40
+ "$or": [
41
+ {"username": user.username},
42
+ {"email": user.email}
43
+ ]
44
+ })
45
+
46
+ if existing:
47
+ raise HTTPException(
48
+ status_code=status.HTTP_400_BAD_REQUEST,
49
+ detail="User with this username or email already exists"
50
+ )
51
+
52
+ user_dict = user.model_dump()
53
+ result = await users_collection.insert_one(user_dict)
54
+
55
+ if result.inserted_id:
56
+ return {"message": "New User Created"}
57
+
58
+ raise HTTPException(
59
+ status_code=status.HTTP_400_BAD_REQUEST,
60
+ detail="Failed to create user"
61
+ )
62
+
63
+
64
+ @router.patch("/update-users/{user_id}", status_code=status.HTTP_200_OK)
65
+ async def update_user(user_id: str, user_data: UserUpdate):
66
+ if not ObjectId.is_valid(user_id):
67
+ raise HTTPException(
68
+ status_code=status.HTTP_400_BAD_REQUEST,
69
+ detail="Invalid user ID"
70
+ )
71
+
72
+ update_data = user_data.model_dump(exclude_unset=True)
73
+ if not update_data:
74
+ raise HTTPException(
75
+ status_code=status.HTTP_400_BAD_REQUEST,
76
+ detail="No data provided"
77
+ )
78
+
79
+ result = await users_collection.update_one(
80
+ {"_id": ObjectId(user_id)},
81
+ {"$set": update_data}
82
+ )
83
+
84
+ if result.matched_count == 0:
85
+ raise HTTPException(
86
+ status_code=status.HTTP_404_NOT_FOUND,
87
+ detail="User not found"
88
+ )
89
+
90
+ return {"message": "User Updated"}
91
+
92
+
93
+ @router.delete("/delete-user/{user_id}", status_code=status.HTTP_200_OK)
94
+ async def delete_user(user_id: str):
95
+ # Validate ObjectId
96
+ if not ObjectId.is_valid(user_id):
97
+ raise HTTPException(
98
+ status_code=status.HTTP_400_BAD_REQUEST,
99
+ detail="Invalid user ID"
100
+ )
101
+
102
+ result = await users_collection.delete_one({"_id": ObjectId(user_id)})
103
+
104
+ if result.deleted_count == 0:
105
+ raise HTTPException(
106
+ status_code=status.HTTP_404_NOT_FOUND,
107
+ detail="User not found"
108
+ )
109
+
110
+ return {"message": "User Deleted"}
111
+
112
+
113
+ # Example Note REST APIs
114
+ @router.get("/get-notes", status_code=status.HTTP_200_OK)
115
+ async def get_notes():
116
+ notes = []
117
+ async for note in notes_collection.find():
118
+ notes.append(serialize_doc(note))
119
+ return {"notes": notes}
120
+
121
+
122
+ @router.post("/create-note", status_code=status.HTTP_201_CREATED)
123
+ async def create_note(note: NoteCreate):
124
+ existing = await notes_collection.find_one({"title": note.title})
125
+
126
+ if existing:
127
+ raise HTTPException(
128
+ status_code=status.HTTP_400_BAD_REQUEST,
129
+ detail="Note with this title already exists"
130
+ )
131
+
132
+ note_dict = note.model_dump()
133
+ result = await notes_collection.insert_one(note_dict)
134
+
135
+ if result.inserted_id:
136
+ return {"message": "New Note Created"}
137
+
138
+ raise HTTPException(
139
+ status_code=status.HTTP_400_BAD_REQUEST,
140
+ detail="Failed to create note"
141
+ )
142
+
143
+
144
+ @router.patch("/update-notes/{note_id}", status_code=status.HTTP_200_OK)
145
+ async def update_note(note_id: str, note_data: NoteUpdate):
146
+ if not ObjectId.is_valid(note_id):
147
+ raise HTTPException(
148
+ status_code=status.HTTP_400_BAD_REQUEST,
149
+ detail="Invalid note ID"
150
+ )
151
+
152
+ update_data = note_data.model_dump(exclude_unset=True)
153
+ if not update_data:
154
+ raise HTTPException(
155
+ status_code=status.HTTP_400_BAD_REQUEST,
156
+ detail="No data provided for updation"
157
+ )
158
+
159
+ result = await notes_collection.update_one(
160
+ {"_id": ObjectId(note_id)},
161
+ {"$set": update_data}
162
+ )
163
+
164
+ if result.matched_count == 0:
165
+ raise HTTPException(
166
+ status_code=status.HTTP_404_NOT_FOUND,
167
+ detail="Note not found"
168
+ )
169
+
170
+ return {"message": "Note Updated"}
171
+
172
+
173
+ @router.delete("/delete-note/{note_id}", status_code=status.HTTP_200_OK)
174
+ async def delete_note(note_id: str):
175
+ if not ObjectId.is_valid(note_id):
176
+ raise HTTPException(
177
+ status_code=status.HTTP_400_BAD_REQUEST,
178
+ detail="Invalid note ID"
179
+ )
180
+
181
+ result = await notes_collection.delete_one({"_id": ObjectId(note_id)})
182
+
183
+ if result.deleted_count == 0:
184
+ raise HTTPException(
185
+ status_code=status.HTTP_404_NOT_FOUND,
186
+ detail="Note not found"
187
+ )
188
+
189
+ return {"message": "Note Deleted"}
@@ -0,0 +1,31 @@
1
+ from pydantic import BaseModel, EmailStr
2
+ from typing import Optional
3
+
4
+ # User Schemas
5
+ class UserCreate(BaseModel):
6
+ username: str
7
+ email: EmailStr
8
+
9
+ class UserUpdate(BaseModel):
10
+ username: Optional[str] = None
11
+ email: Optional[EmailStr] = None
12
+
13
+ class UserResponse(BaseModel):
14
+ id: str
15
+ username: str
16
+ email: str
17
+
18
+
19
+ # Note Schemas
20
+ class NoteCreate(BaseModel):
21
+ title: str
22
+ content: str
23
+
24
+ class NoteUpdate(BaseModel):
25
+ title: Optional[str] = None
26
+ content: Optional[str] = None
27
+
28
+ class NoteResponse(BaseModel):
29
+ id: str
30
+ title: str
31
+ content: str