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
+ );
}
}