diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index 576d189..6cf4932 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -166,6 +166,18 @@ model Product { @@map("products") } +model Doctor { + id String @id @default(uuid()) @db.Uuid + name String @db.VarChar(150) + title String @db.VarChar(150) + avatarUrl String? @map("avatar_url") @db.Text + bio String? @db.Text + clinic String? @db.VarChar(200) + createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz() + + @@map("doctors") +} + model ProductIngredient { productId String @map("product_id") @db.Uuid ingredient String @db.VarChar(150) diff --git a/backend/src/admin/admin.controller.ts b/backend/src/admin/admin.controller.ts index 4bfe20f..a848d96 100644 --- a/backend/src/admin/admin.controller.ts +++ b/backend/src/admin/admin.controller.ts @@ -236,4 +236,36 @@ export class AdminController { const settings = await this.adminService.updateSettings(data); return { success: true, data: settings }; } + + // --- Doctors / Vets --- + @Get('doctors') + @ApiOperation({ summary: 'لیست پزشکان و متخصصان' }) + async getDoctors() { + const doctors = await this.adminService.getDoctors(); + return { success: true, data: doctors }; + } + + @UseGuards(JwtAuthGuard) + @Post('doctors') + @ApiOperation({ summary: 'افزودن پزشک جدید' }) + async createDoctor(@Body() body: any) { + const doctor = await this.adminService.createDoctor(body); + return { success: true, data: doctor }; + } + + @UseGuards(JwtAuthGuard) + @Put('doctors/:id') + @ApiOperation({ summary: 'ویرایش اطلاعات پزشک' }) + async updateDoctor(@Param('id') id: string, @Body() body: any) { + const doctor = await this.adminService.updateDoctor(id, body); + return { success: true, data: doctor }; + } + + @UseGuards(JwtAuthGuard) + @Delete('doctors/:id') + @ApiOperation({ summary: 'حذف پزشک' }) + async deleteDoctor(@Param('id') id: string) { + await this.adminService.deleteDoctor(id); + return { success: true }; + } } diff --git a/backend/src/admin/admin.service.ts b/backend/src/admin/admin.service.ts index 6c7cc29..b3c15b4 100644 --- a/backend/src/admin/admin.service.ts +++ b/backend/src/admin/admin.service.ts @@ -429,4 +429,22 @@ export class AdminService { await this.prisma.$transaction(operations); return this.getSettings(); } + + async getDoctors() { + return this.prisma.doctor.findMany({ + orderBy: { createdAt: 'desc' }, + }); + } + + async createDoctor(data: { name: string; title: string; avatarUrl?: string; bio?: string; clinic?: string }) { + return this.prisma.doctor.create({ data }); + } + + async updateDoctor(id: string, data: { name?: string; title?: string; avatarUrl?: string; bio?: string; clinic?: string }) { + return this.prisma.doctor.update({ where: { id }, data }); + } + + async deleteDoctor(id: string) { + return this.prisma.doctor.delete({ where: { id } }); + } } diff --git a/docs/backlog.md b/docs/backlog.md index d432115..c95bf2f 100644 --- a/docs/backlog.md +++ b/docs/backlog.md @@ -46,7 +46,7 @@ ### 🎥 ویدیوها، پزشکان و پروفایل ادمین (Videos, Doctors & Admin Profile) - [x] **TASK-2.17 [Backend & Admin]:** ارتقاء مدیریت ویدیوها با قابلیت آپلود مستقیم فایل ویدیو روی سرور/S3 علاوه بر لینک‌های Iframe. -- [ ] **TASK-2.18 [DB, Backend & Admin]:** پیاده‌سازی کامل CRUD مدیریت پزشکان/متخصصان (شامل بیوگرافی، تصویر، تخصص) و اتصال پزشک به ویدیوها، مقالات وبلاگ و نظرات کارشناسی محصولات. +- [x] **TASK-2.18 [DB, Backend & Admin]:** پیاده‌سازی کامل CRUD مدیریت پزشکان/متخصصان (شامل بیوگرافی، تصویر، تخصص) و اتصال پزشک به ویدیوها، مقالات وبلاگ و نظرات کارشناسی محصولات. - [x] **TASK-2.19 [Admin Header UI]:** حذف دکمه خروج از Sidebar و اضافه کردن Dropdown کاربر در بالای صفحه سمت چپ (Header) شامل پروفایل، تنظیمات و خروج. - [x] **TASK-2.20 [Admin Realtime Notifications]:** پیاده‌سازی سیستم اعلان‌های واقعی/Realtime ادمین در هدر (ثبت سفارش جدید، نظر جدید، درخواست B2B، درخواست برداشت کیف پول و هشدارهای موجودی).