diff --git a/api/src/controllers/stores.ts b/api/src/controllers/stores.ts index 6535e049..eb561867 100644 --- a/api/src/controllers/stores.ts +++ b/api/src/controllers/stores.ts @@ -39,6 +39,31 @@ export default class StoreController { return res.json({ payouts }); } + // GET /stores/current/managers + public async getCurrentStoreManagers(req: Request, res: Response) { + const store = await this.loadCurrentStore(req); + const managers = await prismaClient.storeManager.findMany({ + where: { storeId: store.id } + }); + return res.json({ managers }); + } + + // GET /stores/:id/payouts + public async getStorePayouts(req: Request, res: Response) { + if (!req.params.id) { + return res.status(400).json({ error: 'Store ID is required' }); + } + + const query = hydrateQuery(req.query); + + const payouts = await prismaClient.payout.findMany({ + where: { storeId: req.params.id }, + ...query + }); + + return res.json({ payouts }); + } + // GET /stores/:id public async getStoreById(req: Request, res: Response) { if (!req.params.id) { @@ -126,7 +151,7 @@ export default class StoreController { const managers = await prismaClient.store .findUnique({ where: { id: req.params.id } }) - .managers(); + .managers({ include: { manager: true } }); return res.json({ managers }); } diff --git a/api/src/routes/stores.ts b/api/src/routes/stores.ts index ad06bcc8..09beedf8 100644 --- a/api/src/routes/stores.ts +++ b/api/src/routes/stores.ts @@ -17,6 +17,8 @@ router.post('/:id/products', authenticate, storeController.createStoreProduct); router.get('/current', authenticate, storeController.getCurrentStore); router.get('/:id', optionalAuth, storeController.getStoreById); router.get('/:id/products', optionalAuth, storeController.getStoreProducts); +router.get('/:id/managers', isAdmin, storeController.getStoreManagers); +router.get('/:id/payouts', isAdmin, storeController.getStorePayouts); router.get('/:id/orders', optionalAuth, storeController.getStoreOrders); export default router; diff --git a/apps/admin/src/app/(dashboard)/stores/[id]/page.tsx b/apps/admin/src/app/(dashboard)/stores/[id]/page.tsx index c80d66db..af2978f3 100644 --- a/apps/admin/src/app/(dashboard)/stores/[id]/page.tsx +++ b/apps/admin/src/app/(dashboard)/stores/[id]/page.tsx @@ -14,7 +14,12 @@ import { TableHeader, TableRow } from '@/components/ui/table'; -import { useStoreProductsQuery, useStoreQuery } from '@/data/queries/stores'; +import { + useStoreProductsQuery, + useStoreQuery, + useStorePayoutsQuery, + useStoreManagersQuery +} from '@/data/queries/stores'; import { formatNaira } from '@/utils/format'; const StoreDetailPage = ({ params }: { params: Promise<{ id: string }> }) => { @@ -22,6 +27,10 @@ const StoreDetailPage = ({ params }: { params: Promise<{ id: string }> }) => { const { data: storeData, isLoading: isLoadingStore } = useStoreQuery(id); const { data: productsData, isLoading: isLoadingProducts } = useStoreProductsQuery(id); + const { data: payoutsData, isLoading: isLoadingPayouts } = + useStorePayoutsQuery(id); + const { data: managersData, isLoading: isLoadingManagers } = + useStoreManagersQuery(id); if (isLoadingStore || isLoadingProducts) { return
Loading...
; @@ -29,6 +38,8 @@ const StoreDetailPage = ({ params }: { params: Promise<{ id: string }> }) => { const store = storeData?.store; const products = productsData?.products || []; + const managers = managersData?.managers || []; + const payouts = payoutsData?.payouts || []; return (
@@ -112,6 +123,64 @@ const StoreDetailPage = ({ params }: { params: Promise<{ id: string }> }) => {
+ +
+ + + Managers + + +
+ + + + Name + Email + + + + {managers.map(({ manager }) => ( + + {manager.name} + {manager.email} + + ))} + +
+
+
+
+ + + + Payouts + + +
+ + + + Amount + Status + Date + + + + {payoutsData?.payouts.map(payout => ( + + {formatNaira(payout.amount)} + {payout.status} + + {new Date(payout.createdAt).toLocaleDateString()} + + + ))} + +
+
+
+
+
); }; diff --git a/apps/admin/src/app/(dashboard)/stores/page.tsx b/apps/admin/src/app/(dashboard)/stores/page.tsx index 08659cc8..79e8793b 100644 --- a/apps/admin/src/app/(dashboard)/stores/page.tsx +++ b/apps/admin/src/app/(dashboard)/stores/page.tsx @@ -62,13 +62,13 @@ const columns: ColumnDef[] = [ Actions navigator.clipboard.writeText(row.original.id)} + onClick={() => navigator.clipboard.writeText(store.id)} > Copy store ID router.push(`/stores/${row.original.id}`)} + onClick={() => router.push(`/stores/${store.id}`)} > View store @@ -81,7 +81,6 @@ const columns: ColumnDef[] = [ export default function StoresPage() { const { data, isLoading } = useStoresQuery(); - const router = useRouter(); return (
diff --git a/apps/admin/src/data/queries/stores.ts b/apps/admin/src/data/queries/stores.ts index 47b2855d..25ab447d 100644 --- a/apps/admin/src/data/queries/stores.ts +++ b/apps/admin/src/data/queries/stores.ts @@ -33,3 +33,19 @@ export const useStoreOrdersQuery = (id: string, params?: StoreFilters) => { enabled: !!id }); }; + +export const useStorePayoutsQuery = (id: string, params?: StoreFilters) => { + return useQuery({ + queryKey: ['stores', id, 'payouts', params], + queryFn: () => dataService.stores.getStorePayouts(id, params), + enabled: !!id + }); +}; + +export const useStoreManagersQuery = (id: string, params?: StoreFilters) => { + return useQuery({ + queryKey: ['stores', id, 'managers', params], + queryFn: () => dataService.stores.getStoreManagers(id, params), + enabled: !!id + }); +}; diff --git a/apps/admin/src/data/services/stores.ts b/apps/admin/src/data/services/stores.ts index fd1f330b..fb31acd5 100644 --- a/apps/admin/src/data/services/stores.ts +++ b/apps/admin/src/data/services/stores.ts @@ -1,4 +1,5 @@ import { APIService } from './api'; +import { Order } from './orders'; import { Product } from './products'; export interface Store { @@ -13,6 +14,14 @@ export interface Store { updatedAt: string; } +export interface Payout { + id: string; + amount: number; + status: string; + createdAt: string; + updatedAt: string; +} + export interface GetStoresResponse { stores: Store[]; } @@ -35,6 +44,24 @@ export interface GetStoreResponse { store: Store; } +export interface GetStoreManagersResponse { + managers: { + manager: { + id: string; + name: string; + email: string; + }; + }[]; +} + +export interface GetStorePayoutsResponse { + payouts: Payout[]; +} + +export interface GetStoreOrdersResponse { + orders: Order[]; +} + export class StoreService { constructor(private readonly api: APIService) {} @@ -62,6 +89,20 @@ export class StoreService { } async getStoreOrders(id: string, params?: StoreFilters) { - return this.api.get(`/stores/${id}/orders`, params); + return this.api.get(`/stores/${id}/orders`, params); + } + + async getStorePayouts(id: string, params?: StoreFilters) { + return this.api.get( + `/stores/${id}/payouts`, + params + ); + } + + async getStoreManagers(id: string, params?: StoreFilters) { + return this.api.get( + `/stores/${id}/managers`, + params + ); } }