Skip to content

NimaHaji/ReservationSystemAPI

Repository files navigation

📅 Appointment Reservation System API

🎯 معرفی پروژه

این پروژه یک API سیستم رزرو نوبت است که با ASP.NET Core و بر اساس اصول Clean Architecture طراحی و پیاده‌سازی شده است.

تمرکز اصلی پروژه بر:

  • ✅ امنیت مبتنی بر JWT
  • ✅ طراحی RESTful واقعی
  • ✅ جداسازی مسئولیت‌ها
  • ✅ جلوگیری از ارسال و دستکاری شناسه کاربر
  • ✅ اعمال Authorization در لایه Application

می‌باشد؛ به‌طوری که API برای استفاده در پروژه‌های واقعی و Production-ready مناسب است.


🧱 معماری پروژه (Clean Architecture)

ساختار کلی پروژه:

Api
 └── Controllers
      └── REST Endpoints

Application
 ├── Interfaces
 │   └── IUserContext
 ├── Features
 │   ├── Appointment
 │   ├── User
 │   └── Service
 ├── DTOs
 └── Application Services

Infrastructure
 ├── Security
 │   ├── JWT
 │   └── UserContext
 └── Persistence

✅ لایه Application مستقل از Api و Infrastructure است
✅ هیچ منطق امنیتی حیاتی صرفاً در Controllerها قرار ندارد


🔐 احراز هویت (JWT Authentication)

JWT

  • احراز هویت کاربران با JSON Web Token
  • ارسال Token در Header درخواست:
Authorization: Bearer {token}

UserContext

برای حذف وابستگی به userId ارسالی از کلاینت:

  • Interface: IUserContext در لایه Application
  • Implementation: UserContext در Infrastructure
  • استخراج اطلاعات از JWT Claims:
    • UserIdsub یا ClaimTypes.NameIdentifier
    • RoleClaimTypes.Role

✅ تمام عملیات وابسته به کاربر، هویت را از JWT می‌گیرند، نه از ورودی کلاینت.


🛡️ Authorization و Role Management

EnsureAdmin

برای عملیات Admin-only، متد زیر در AppServiceها پیاده‌سازی شده است:

EnsureAdmin();

این متد:

  • Role کاربر جاری را بررسی می‌کند
  • در صورت عدم دسترسی، Exception پرتاب می‌کند

✅ حتی اگر Controller اشتباه پیکربندی شود،
لایه Application همچنان امنیت را حفظ می‌کند (Defense in Depth).


👤 بررسی مالکیت (Ownership Check)

برای عملیات حساس کاربرمحور مانند:

  • ویرایش نوبت
  • لغو نوبت
  • مشاهده نوبت‌های شخصی

مالکیت بررسی می‌شود:

appointment.UserId == CurrentUserId

✅ هیچ کاربری به منابع کاربران دیگر دسترسی ندارد.


📅 Appointment API

قابلیت‌ها

  • ایجاد نوبت
  • ویرایش جزئی نوبت (PATCH)
  • لغو نوبت
  • مشاهده نوبت‌های شخصی (JWT-Based)
  • مشاهده تمام نوبت‌ها (Admin)

Endpointها

POST    /api/appointment
PATCH   /api/appointment/{id}
DELETE  /api/appointment/{id}
GET     /api/appointment/my
GET     /api/appointment        (Admin only)

👥 User API

امکانات

  • ثبت‌نام و ورود
  • دریافت پروفایل کاربر جاری
  • ویرایش پروفایل
  • تغییر رمز عبور
  • حذف حساب کاربری
  • مشاهده لیست کاربران (Admin)

Endpointها

POST   /api/user/register
POST   /api/user/login
POST   /api/user/refresh
GET    /api/user/me
PATCH  /api/user/me
POST   /api/user/change-password
DELETE /api/user/me
GET    /api/user               (Admin only)

🌐 اصول REST رعایت‌شده

  • ✅ استفاده صحیح از HTTP Verbs
  • ✅ Resource-based URL
  • ✅ حذف Action-based Routeها
  • ✅ استفاده از me به‌جای ارسال userId
  • ✅ عدم دریافت اطلاعات هویتی حساس از کلاینت

🧪 متدهای HTTP

Method کاربرد
GET دریافت اطلاعات
POST ایجاد Resource
PATCH ویرایش جزئی
DELETE حذف / لغو

⚙️ تکنولوژی‌ها

  • ASP.NET Core
  • JWT Authentication
  • Clean Architecture
  • Entity Framework Core
  • FluentValidation

🚀 اجرای پروژه

dotnet restore
dotnet run

⚠️ وضعیت توسعه و نکات مهم

این پروژه در حال حاضر نسخه‌ی اولیه (v1) محسوب می‌شود.

با وجود اینکه:

  • ساختار معماری به‌صورت اصولی (Clean Architecture) طراحی شده
  • ملاحظات امنیتی (JWT، Authorization، Ownership Check) رعایت شده
  • API از نظر RESTful و Business Logic پایدار است

ممکن است:

  • 🐞 باگ‌های منطقی یا لبه‌ای (Edge Case) وجود داشته باشد
  • 🔄 برخی بخش‌ها در آینده Refactor یا بهینه‌سازی شوند
  • ➕ قابلیت‌های جدید یا تغییر در Endpointها اضافه شود

✅ پروژه به‌صورت Active Development نگهداری می‌شود و
در بازه‌های زمانی مختلف به‌روزرسانی خواهد شد.

هدف این نسخه، ارائه‌ی یک پایه‌ی تمیز، امن و قابل توسعه برای ادامه‌ی مسیر است.

About

این پروژه یک API بک‌اند برای سیستم رزرو نوبت است که با استفاده از ASP.NET Core و بر پایه‌ی Clean Architecture طراحی و پیاده‌سازی شده است.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages