feat(doctor): implement Doctors / Vets CRUD backend and DB model (TASK-2.18)

This commit is contained in:
parsa aghaei 2026-08-02 09:29:33 +03:30
parent d784f3fcc7
commit 47bff2c6ed
4 changed files with 63 additions and 1 deletions

View File

@ -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)

View File

@ -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 };
}
}

View File

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

View File

@ -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، درخواست برداشت کیف پول و هشدارهای موجودی).