create-aziz-app 2.0.12 → 2.0.14

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.
@@ -0,0 +1,536 @@
1
+ # Next.js App Router Style API Routes
2
+
3
+ ## Overview
4
+
5
+ Write API routes **exactly like Next.js App Router** with `NextResponse` and named HTTP method exports!
6
+
7
+ ## Quick Example
8
+
9
+ ```javascript
10
+ // api/getUser.js
11
+ const { NextResponse } = require('../modules/next-response');
12
+
13
+ export async function GET(request) {
14
+ const { searchParams } = new URL(request.url);
15
+ const email = searchParams.get('email');
16
+
17
+ if (!email) {
18
+ return NextResponse.json(
19
+ { error: 'Email required' },
20
+ { status: 400 }
21
+ );
22
+ }
23
+
24
+ const user = await findUser(email);
25
+ return NextResponse.json(user);
26
+ }
27
+
28
+ module.exports = { GET };
29
+ ```
30
+
31
+ ## NextResponse API
32
+
33
+ ### NextResponse.json()
34
+
35
+ ```javascript
36
+ // Success response
37
+ return NextResponse.json({ message: 'Success' });
38
+
39
+ // With status code
40
+ return NextResponse.json(
41
+ { error: 'Not found' },
42
+ { status: 404 }
43
+ );
44
+
45
+ // With custom headers
46
+ return NextResponse.json(
47
+ { data: 'value' },
48
+ {
49
+ status: 200,
50
+ headers: {
51
+ 'X-Custom-Header': 'value'
52
+ }
53
+ }
54
+ );
55
+ ```
56
+
57
+ ### NextResponse.text()
58
+
59
+ ```javascript
60
+ return NextResponse.text('Hello World');
61
+
62
+ return NextResponse.text(
63
+ 'Error message',
64
+ { status: 500 }
65
+ );
66
+ ```
67
+
68
+ ### NextResponse.redirect()
69
+
70
+ ```javascript
71
+ return NextResponse.redirect('/login');
72
+
73
+ return NextResponse.redirect(
74
+ '/dashboard',
75
+ { status: 307 }
76
+ );
77
+ ```
78
+
79
+ ### NextResponse.error()
80
+
81
+ ```javascript
82
+ return NextResponse.error();
83
+ // Returns 500 with generic error message
84
+ ```
85
+
86
+ ## HTTP Method Exports
87
+
88
+ ### Single Method
89
+
90
+ ```javascript
91
+ // api/getUser.js
92
+ const { NextResponse } = require('../modules/next-response');
93
+
94
+ async function GET(request) {
95
+ return NextResponse.json({ message: 'GET request' });
96
+ }
97
+
98
+ module.exports = { GET };
99
+ ```
100
+
101
+ ### Multiple Methods
102
+
103
+ ```javascript
104
+ // api/users.js
105
+ const { NextResponse } = require('../modules/next-response');
106
+
107
+ async function GET(request) {
108
+ const users = await getAllUsers();
109
+ return NextResponse.json(users);
110
+ }
111
+
112
+ async function POST(request) {
113
+ const body = await request.json();
114
+ const user = await createUser(body);
115
+ return NextResponse.json(user, { status: 201 });
116
+ }
117
+
118
+ async function PUT(request) {
119
+ const body = await request.json();
120
+ const user = await updateUser(body);
121
+ return NextResponse.json(user);
122
+ }
123
+
124
+ async function DELETE(request) {
125
+ const { searchParams } = new URL(request.url);
126
+ const id = searchParams.get('id');
127
+ await deleteUser(id);
128
+ return NextResponse.json({ message: 'Deleted' });
129
+ }
130
+
131
+ module.exports = { GET, POST, PUT, DELETE };
132
+ ```
133
+
134
+ ## Request Object
135
+
136
+ ### URL and Search Params
137
+
138
+ ```javascript
139
+ async function GET(request) {
140
+ // Parse URL
141
+ const { searchParams } = new URL(request.url);
142
+
143
+ // Get query parameters
144
+ const email = searchParams.get('email');
145
+ const id = searchParams.get('id');
146
+ const page = searchParams.get('page') || '1';
147
+
148
+ return NextResponse.json({ email, id, page });
149
+ }
150
+ ```
151
+
152
+ ### Request Body
153
+
154
+ ```javascript
155
+ async function POST(request) {
156
+ // Parse JSON body
157
+ const body = await request.json();
158
+ const { name, email, password } = body;
159
+
160
+ return NextResponse.json({ name, email });
161
+ }
162
+ ```
163
+
164
+ ### Headers
165
+
166
+ ```javascript
167
+ async function GET(request) {
168
+ // Access headers
169
+ const auth = request.headers.authorization;
170
+ const contentType = request.headers['content-type'];
171
+
172
+ return NextResponse.json({ auth, contentType });
173
+ }
174
+ ```
175
+
176
+ ### Method
177
+
178
+ ```javascript
179
+ async function GET(request) {
180
+ console.log(request.method); // 'GET'
181
+ return NextResponse.json({ method: request.method });
182
+ }
183
+ ```
184
+
185
+ ## Complete Examples
186
+
187
+ ### Example 1: User Login
188
+
189
+ ```javascript
190
+ // api/loginUser.js
191
+ const { NextResponse } = require('../modules/next-response');
192
+ const connectDB = require('../lib/db');
193
+ const User = require('../models/User');
194
+
195
+ async function POST(request) {
196
+ try {
197
+ await connectDB();
198
+
199
+ const { email, password } = await request.json();
200
+
201
+ // Validation
202
+ if (!email || !password) {
203
+ return NextResponse.json(
204
+ { error: 'Email and password required' },
205
+ { status: 400 }
206
+ );
207
+ }
208
+
209
+ // Find user
210
+ const user = await User.findOne({ email });
211
+ if (!user) {
212
+ return NextResponse.json(
213
+ { error: 'Invalid credentials' },
214
+ { status: 401 }
215
+ );
216
+ }
217
+
218
+ // Check password (use bcrypt in production!)
219
+ if (user.password !== password) {
220
+ return NextResponse.json(
221
+ { error: 'Invalid credentials' },
222
+ { status: 401 }
223
+ );
224
+ }
225
+
226
+ // Return user data
227
+ const { password: _, ...userData } = user;
228
+ return NextResponse.json(userData);
229
+
230
+ } catch (error) {
231
+ console.error('Login error:', error);
232
+ return NextResponse.json(
233
+ { error: 'Failed to login' },
234
+ { status: 500 }
235
+ );
236
+ }
237
+ }
238
+
239
+ module.exports = { POST };
240
+ ```
241
+
242
+ ### Example 2: Create User
243
+
244
+ ```javascript
245
+ // api/createUser.js
246
+ const { NextResponse } = require('../modules/next-response');
247
+ const connectDB = require('../lib/db');
248
+ const User = require('../models/User');
249
+
250
+ async function POST(request) {
251
+ try {
252
+ await connectDB();
253
+
254
+ const body = await request.json();
255
+ const { name, email, password, role, phone } = body;
256
+
257
+ // Validation
258
+ if (!name || !email || !password) {
259
+ return NextResponse.json(
260
+ { error: 'Name, email, and password required' },
261
+ { status: 400 }
262
+ );
263
+ }
264
+
265
+ // Check if exists
266
+ const existing = await User.findOne({ email });
267
+ if (existing) {
268
+ return NextResponse.json(
269
+ { error: 'User already exists' },
270
+ { status: 409 }
271
+ );
272
+ }
273
+
274
+ // Create user
275
+ const user = await User.create({
276
+ name,
277
+ email,
278
+ password, // Hash with bcrypt in production!
279
+ role: role || 'user',
280
+ phone
281
+ });
282
+
283
+ // Return without password
284
+ const { password: _, ...userData } = user;
285
+ return NextResponse.json(
286
+ { message: 'User created', user: userData },
287
+ { status: 201 }
288
+ );
289
+
290
+ } catch (error) {
291
+ console.error('Create user error:', error);
292
+ return NextResponse.json(
293
+ { error: 'Failed to create user' },
294
+ { status: 500 }
295
+ );
296
+ }
297
+ }
298
+
299
+ module.exports = { POST };
300
+ ```
301
+
302
+ ### Example 3: Get User
303
+
304
+ ```javascript
305
+ // api/getUser.js
306
+ const { NextResponse } = require('../modules/next-response');
307
+ const connectDB = require('../lib/db');
308
+ const User = require('../models/User');
309
+
310
+ async function GET(request) {
311
+ try {
312
+ await connectDB();
313
+
314
+ const { searchParams } = new URL(request.url);
315
+ const email = searchParams.get('email');
316
+ const id = searchParams.get('id');
317
+
318
+ if (email) {
319
+ const user = await User.findOne({ email });
320
+ if (!user) {
321
+ return NextResponse.json(
322
+ { error: 'User not found' },
323
+ { status: 404 }
324
+ );
325
+ }
326
+ return NextResponse.json(user);
327
+ }
328
+
329
+ if (id) {
330
+ const user = await User.findById(id);
331
+ if (!user) {
332
+ return NextResponse.json(
333
+ { error: 'User not found' },
334
+ { status: 404 }
335
+ );
336
+ }
337
+ return NextResponse.json(user);
338
+ }
339
+
340
+ return NextResponse.json(
341
+ { error: 'Email or ID required' },
342
+ { status: 400 }
343
+ );
344
+
345
+ } catch (error) {
346
+ console.error('Error:', error);
347
+ return NextResponse.json(
348
+ { error: 'Failed to fetch user' },
349
+ { status: 500 }
350
+ );
351
+ }
352
+ }
353
+
354
+ module.exports = { GET };
355
+ ```
356
+
357
+ ## Client-Side Usage
358
+
359
+ ### Basic Fetch
360
+
361
+ ```javascript
362
+ async function LoginUser(email, password) {
363
+ try {
364
+ const response = await fetch('/api/loginUser', {
365
+ method: 'POST',
366
+ headers: { 'Content-Type': 'application/json' },
367
+ body: JSON.stringify({ email, password })
368
+ });
369
+
370
+ const result = await response.json();
371
+
372
+ if (!response.ok) {
373
+ throw new Error(result.error);
374
+ }
375
+
376
+ return result;
377
+ } catch (error) {
378
+ console.error('Login failed:', error);
379
+ throw error;
380
+ }
381
+ }
382
+ ```
383
+
384
+ ### With React Hooks
385
+
386
+ ```javascript
387
+ function LoginForm() {
388
+ const [email, setEmail] = useState('');
389
+ const [password, setPassword] = useState('');
390
+ const [error, setError] = useState('');
391
+ const [loading, setLoading] = useState(false);
392
+
393
+ const handleLogin = async (e) => {
394
+ e.preventDefault();
395
+ setLoading(true);
396
+ setError('');
397
+
398
+ try {
399
+ const response = await fetch('/api/loginUser', {
400
+ method: 'POST',
401
+ headers: { 'Content-Type': 'application/json' },
402
+ body: JSON.stringify({ email, password })
403
+ });
404
+
405
+ const result = await response.json();
406
+
407
+ if (!response.ok) {
408
+ setError(result.error);
409
+ return;
410
+ }
411
+
412
+ // Success!
413
+ localStorage.setItem('user', JSON.stringify(result));
414
+ window.location.href = '/dashboard';
415
+
416
+ } catch (err) {
417
+ setError('Failed to login');
418
+ } finally {
419
+ setLoading(false);
420
+ }
421
+ };
422
+
423
+ return (
424
+ <form onSubmit={handleLogin}>
425
+ <input
426
+ type="email"
427
+ value={email}
428
+ onChange={(e) => setEmail(e.target.value)}
429
+ placeholder="Email"
430
+ />
431
+ <input
432
+ type="password"
433
+ value={password}
434
+ onChange={(e) => setPassword(e.target.value)}
435
+ placeholder="Password"
436
+ />
437
+ {error && <p style={{ color: 'red' }}>{error}</p>}
438
+ <button type="submit" disabled={loading}>
439
+ {loading ? 'Loading...' : 'Login'}
440
+ </button>
441
+ </form>
442
+ );
443
+ }
444
+ ```
445
+
446
+ ## Database Integration
447
+
448
+ ### Setup (MongoDB Example)
449
+
450
+ ```bash
451
+ npm install mongoose
452
+ ```
453
+
454
+ ```javascript
455
+ // lib/db.js
456
+ const mongoose = require('mongoose');
457
+
458
+ async function connectDB() {
459
+ if (mongoose.connections[0].readyState) {
460
+ return;
461
+ }
462
+
463
+ await mongoose.connect(process.env.MONGODB_URI);
464
+ console.log('✅ MongoDB connected');
465
+ }
466
+
467
+ module.exports = connectDB;
468
+ ```
469
+
470
+ ### Model (Mongoose Example)
471
+
472
+ ```javascript
473
+ // models/User.js
474
+ const mongoose = require('mongoose');
475
+
476
+ const userSchema = new mongoose.Schema({
477
+ name: { type: String, required: true },
478
+ email: { type: String, required: true, unique: true },
479
+ password: { type: String, required: true },
480
+ role: { type: String, enum: ['user', 'admin'], default: 'user' },
481
+ phone: String
482
+ }, { timestamps: true });
483
+
484
+ module.exports = mongoose.models.User || mongoose.model('User', userSchema);
485
+ ```
486
+
487
+ ## Environment Variables
488
+
489
+ ```bash
490
+ # .env.local
491
+ MONGODB_URI=mongodb://localhost:27017/myapp
492
+ DATABASE_URL=postgresql://user:pass@localhost:5432/mydb
493
+ API_KEY=your_secret_key
494
+ ```
495
+
496
+ ```javascript
497
+ // Access in API routes
498
+ const dbUrl = process.env.MONGODB_URI;
499
+ const apiKey = process.env.API_KEY;
500
+ ```
501
+
502
+ ## Migration from Old Style
503
+
504
+ ### Old Style
505
+
506
+ ```javascript
507
+ export default async function handler(req, res) {
508
+ if (req.method === 'GET') {
509
+ return res.status(200).json({ data: 'value' });
510
+ }
511
+ }
512
+ ```
513
+
514
+ ### New Style
515
+
516
+ ```javascript
517
+ const { NextResponse } = require('../modules/next-response');
518
+
519
+ async function GET(request) {
520
+ return NextResponse.json({ data: 'value' });
521
+ }
522
+
523
+ module.exports = { GET };
524
+ ```
525
+
526
+ ## Summary
527
+
528
+ ✅ **Identical to Next.js App Router**
529
+ ✅ **NextResponse API**
530
+ ✅ **Named HTTP method exports**
531
+ ✅ **URL and search params**
532
+ ✅ **Request body parsing**
533
+ ✅ **Database integration ready**
534
+ ✅ **Easy migration path**
535
+
536
+ Write your APIs exactly like Next.js! 🎉