Skip to content

Commit fb8c5b9

Browse files
Merge pull request #6 from StreetSupport/feature/3011-build-user-management-interface
3011 - Fixed bugs
2 parents 2b0638a + 01cb507 commit fb8c5b9

File tree

26 files changed

+285
-234
lines changed

26 files changed

+285
-234
lines changed

src/app/api/banners/[id]/route.ts

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { NextRequest, NextResponse } from 'next/server';
1+
import { NextRequest } from 'next/server';
22
import { withAuth, AuthenticatedApiHandler } from '@/lib/withAuth';
33
import { hasApiAccess } from '@/lib/userService';
44
import { HTTP_METHODS } from '@/constants/httpMethods';
5-
import { sendForbidden, sendInternalError, proxyResponse } from '@/utils/apiResponses';
5+
import { sendForbidden, sendInternalError, proxyResponse, sendError } from '@/utils/apiResponses';
66

77
const API_BASE_URL = process.env.API_BASE_URL;
88

@@ -22,14 +22,14 @@ const getHandler: AuthenticatedApiHandler = async (req: NextRequest, context, au
2222

2323
if (!response.ok) {
2424
const errorData = await response.json();
25-
return NextResponse.json(errorData, { status: response.status });
25+
return sendError(response.status, errorData.error || 'Failed to fetch banner');
2626
}
2727

2828
const data = await response.json();
2929
return proxyResponse(data);
3030
} catch (error) {
31-
32-
return sendInternalError(`Failed to fetch banner: ${error}`);
31+
console.error('Error fetching banner:', error);
32+
return sendInternalError('Failed to fetch banner');
3333
}
3434
};
3535

@@ -49,15 +49,16 @@ const putHandler: AuthenticatedApiHandler = async (req: NextRequest, context, au
4949
body: formData,
5050
});
5151

52+
const data = await response.json();
53+
5254
if (!response.ok) {
53-
const errorData = await response.json();
54-
return NextResponse.json(errorData, { status: response.status });
55+
return sendError(response.status, data.error || 'Failed to update banner');
5556
}
5657

57-
const data = await response.json();
5858
return proxyResponse(data);
5959
} catch (error) {
60-
return sendInternalError(`Failed to update banner: ${error}`);
60+
console.error('Error updating banner:', error);
61+
return sendInternalError('Failed to update banner');
6162
}
6263
};
6364

@@ -76,12 +77,12 @@ const deleteHandler: AuthenticatedApiHandler = async (req: NextRequest, context,
7677
},
7778
});
7879

80+
const data = await response.json();
81+
7982
if (!response.ok) {
80-
const errorData = await response.json();
81-
return NextResponse.json(errorData, { status: response.status });
83+
return sendError(response.status, data.error || 'Failed to delete banner');
8284
}
8385

84-
const data = await response.json();
8586
return proxyResponse(data);
8687
} catch (error) {
8788
console.error('Error deleting banner:', error);

src/app/api/banners/[id]/toggle/route.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { HTTP_METHODS } from "@/constants/httpMethods";
2-
import { NextRequest, NextResponse } from "next/server";
2+
import { NextRequest } from "next/server";
33
import { withAuth, AuthenticatedApiHandler } from '@/lib/withAuth';
44
import { hasApiAccess } from '@/lib/userService';
5-
import { sendForbidden, sendInternalError, proxyResponse } from '@/utils/apiResponses';
5+
import { sendForbidden, sendInternalError, proxyResponse, sendError } from '@/utils/apiResponses';
66

77
const API_BASE_URL = process.env.API_BASE_URL;
88

@@ -21,12 +21,12 @@ const patchHandler: AuthenticatedApiHandler = async (req: NextRequest, context,
2121
},
2222
});
2323

24+
const data = await response.json();
25+
2426
if (!response.ok) {
25-
const data = await response.json();
26-
return NextResponse.json({ message: data?.message || 'Failed to toggle banner status' }, { status: response.status });
27+
return sendError(response.status, data.error || 'Failed to toggle banner status');
2728
}
2829

29-
const data = await response.json();
3030
return proxyResponse(data);
3131
} catch (error) {
3232
console.error('Error toggling banner status:', error);

src/app/api/banners/route.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import { NextRequest, NextResponse } from 'next/server';
1+
import { NextRequest } from 'next/server';
22
import { withAuth, AuthenticatedApiHandler } from '@/lib/withAuth';
33
import { hasApiAccess } from '@/lib/userService';
44
import { HTTP_METHODS } from '@/constants/httpMethods';
5-
import { sendForbidden, sendInternalError, proxyResponse } from '@/utils/apiResponses';
5+
import { sendForbidden, sendInternalError, proxyResponse, sendError } from '@/utils/apiResponses';
66
import { UserAuthClaims } from '@/types/auth';
77
import { getUserLocationSlugs } from '@/utils/locationUtils';
88

9-
const API_BASE_URL = process.env.API_BASE_URL || 'http://localhost:5000';
9+
const API_BASE_URL = process.env.API_BASE_URL;
1010

1111
const getHandler: AuthenticatedApiHandler = async (req: NextRequest, context, auth) => {
1212
try {
@@ -36,11 +36,12 @@ const getHandler: AuthenticatedApiHandler = async (req: NextRequest, context, au
3636
},
3737
});
3838

39+
const data = await response.json();
40+
3941
if (!response.ok) {
40-
throw new Error(`API responded with status: ${response.status}`);
42+
return sendError(response.status, data.error || 'Failed to fetch banners');
4143
}
4244

43-
const data = await response.json();
4445
return proxyResponse(data);
4546
} catch (error) {
4647
console.error('Error fetching banners:', error);
@@ -64,12 +65,12 @@ const postHandler: AuthenticatedApiHandler = async (req: NextRequest, context, a
6465
body: formData,
6566
});
6667

68+
const data = await response.json();
69+
6770
if (!response.ok) {
68-
const errorData = await response.json();
69-
return NextResponse.json(errorData, { status: response.status });
71+
return sendError(response.status, data.error || 'Failed to create banner');
7072
}
7173

72-
const data = await response.json();
7374
return proxyResponse(data);
7475
} catch (error) {
7576
console.error('Error creating banner:', error);

src/app/api/cities/route.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { NextRequest } from 'next/server';
22
import { withAuth, AuthenticatedApiHandler } from '@/lib/withAuth';
33
import { hasApiAccess } from '@/lib/userService';
44
import { HTTP_METHODS } from '@/constants/httpMethods';
5-
import { sendForbidden, sendInternalError, proxyResponse } from '@/utils/apiResponses';
5+
import { sendForbidden, sendInternalError, proxyResponse, sendError } from '@/utils/apiResponses';
66
import { UserAuthClaims } from '@/types/auth';
77
import { getUserLocationSlugs } from '@/utils/locationUtils';
88

@@ -15,8 +15,10 @@ const getHandler: AuthenticatedApiHandler = async (req: NextRequest, context, au
1515
}
1616

1717
// Add location filtering for CityAdmin users
18+
// Check if this request is from Users page (restrictVolunteerAdmin query param)
19+
const restrictVolunteerAdmin = req.nextUrl.searchParams.get('restrictVolunteerAdmin') === 'true';
1820
const userAuthClaims = auth.session.user.authClaims as UserAuthClaims;
19-
const locationSlugs = getUserLocationSlugs(userAuthClaims);
21+
const locationSlugs = getUserLocationSlugs(userAuthClaims, restrictVolunteerAdmin);
2022

2123
// Build query string
2224
let url = `${API_BASE_URL}/api/cities`;
@@ -36,14 +38,15 @@ const getHandler: AuthenticatedApiHandler = async (req: NextRequest, context, au
3638
},
3739
});
3840

41+
const data = await response.json();
42+
3943
if (!response.ok) {
40-
throw new Error(`Backend API error: ${response.status}`);
44+
return sendError(response.status, data.error || 'Failed to fetch cities');
4145
}
4246

43-
const data = await response.json();
4447
return proxyResponse(data);
4548
} catch (error) {
46-
console.error('Cities API error:', error);
49+
console.error('Locations API error:', error);
4750
return sendInternalError();
4851
}
4952
};

src/app/api/users/[id]/route.ts

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { NextRequest, NextResponse } from 'next/server';
1+
import { NextRequest } from 'next/server';
22
import { withAuth, AuthenticatedApiHandler } from '@/lib/withAuth';
33
import { hasApiAccess } from '@/lib/userService';
44
import { HTTP_METHODS } from '@/constants/httpMethods';
5-
import { sendForbidden, sendInternalError, proxyResponse } from '@/utils/apiResponses';
5+
import { sendForbidden, sendInternalError, proxyResponse, sendError } from '@/utils/apiResponses';
66

7-
const API_BASE_URL = process.env.API_BASE_URL || 'http://localhost:5000';
7+
const API_BASE_URL = process.env.API_BASE_URL;
88

99
const getHandler: AuthenticatedApiHandler = async (req: NextRequest, context, auth) => {
1010
try {
@@ -21,15 +21,12 @@ const getHandler: AuthenticatedApiHandler = async (req: NextRequest, context, au
2121
},
2222
});
2323

24+
const data = await response.json();
25+
2426
if (!response.ok) {
25-
const data = await response.json();
26-
return NextResponse.json(
27-
{ success: false, error: data.error || 'Failed to fetch user' },
28-
{ status: response.status }
29-
);
27+
return sendError(response.status, data.error || 'Failed to fetch user');
3028
}
3129

32-
const data = await response.json();
3330
return proxyResponse(data);
3431
} catch (error) {
3532
console.error('Error fetching user:', error);
@@ -55,15 +52,12 @@ const putHandler: AuthenticatedApiHandler = async (req: NextRequest, context, au
5552
body: JSON.stringify(body),
5653
});
5754

55+
const data = await response.json();
56+
5857
if (!response.ok) {
59-
const data = await response.json();
60-
return NextResponse.json(
61-
{ success: false, error: data.error || 'Failed to update user' },
62-
{ status: response.status }
63-
);
58+
return sendError(response.status, data.error || 'Failed to update user');
6459
}
6560

66-
const data = await response.json();
6761
return proxyResponse(data);
6862
} catch (error) {
6963
console.error('Error updating user:', error);
@@ -86,15 +80,12 @@ const deleteHandler: AuthenticatedApiHandler = async (req: NextRequest, context,
8680
},
8781
});
8882

83+
const data = await response.json();
84+
8985
if (!response.ok) {
90-
const data = await response.json();
91-
return NextResponse.json(
92-
{ success: false, error: data.error || 'Failed to delete user' },
93-
{ status: response.status }
94-
);
86+
return sendError(response.status, data.error || 'Failed to delete user');
9587
}
9688

97-
const data = await response.json();
9889
return proxyResponse(data);
9990
} catch (error) {
10091
console.error('Error deleting user:', error);

src/app/api/users/[id]/toggle-active/route.ts

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { NextRequest, NextResponse } from 'next/server';
1+
import { NextRequest } from 'next/server';
22
import { withAuth, AuthenticatedApiHandler } from '@/lib/withAuth';
33
import { hasApiAccess } from '@/lib/userService';
44
import { HTTP_METHODS } from '@/constants/httpMethods';
5-
import { sendForbidden, sendInternalError, proxyResponse } from '@/utils/apiResponses';
5+
import { sendForbidden, sendInternalError, proxyResponse, sendError } from '@/utils/apiResponses';
66

7-
const API_BASE_URL = process.env.API_BASE_URL || 'http://localhost:5000';
7+
const API_BASE_URL = process.env.API_BASE_URL;
88

99
const patchHandler: AuthenticatedApiHandler = async (req: NextRequest, context, auth) => {
1010
try {
@@ -21,15 +21,12 @@ const patchHandler: AuthenticatedApiHandler = async (req: NextRequest, context,
2121
},
2222
});
2323

24+
const data = await response.json();
25+
2426
if (!response.ok) {
25-
const data = await response.json();
26-
return NextResponse.json(
27-
{ success: false, error: data.error || 'Failed to toggle user status' },
28-
{ status: response.status }
29-
);
27+
return sendError(response.status, data.error || 'Failed to toggle user status');
3028
}
3129

32-
const data = await response.json();
3330
return proxyResponse(data);
3431
} catch (error) {
3532
console.error('Error toggling user status:', error);

0 commit comments

Comments
 (0)