Skip to content

Latest commit

ย 

History

History
403 lines (318 loc) ยท 13.8 KB

File metadata and controls

403 lines (318 loc) ยท 13.8 KB

๐Ÿ“š OpenLibraryRent

ใƒžใƒซใƒใƒ†ใƒŠใƒณใƒˆๅฏพๅฟœ ๅ›ณๆ›ธ่ฒธๅ‡บ็ฎก็†ใ‚ทใ‚นใƒ†ใƒ 

Finbuckle.MultiTenantใซใ‚ˆใ‚‹ใƒ†ใƒŠใƒณใƒˆๅˆ†้›ขใ‚’ๅฎŸ็พ

.NET SvelteKit PostgreSQL License

ใƒ‡ใƒขใ‚’่ฆ‹ใ‚‹ | ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆ | ใƒใ‚ฐๅ ฑๅ‘Š


โœจ ็‰นๅพด

  • ๐Ÿ” ใƒžใƒซใƒใƒ†ใƒŠใƒณใƒˆๅˆ†้›ข - Finbuckle.MultiTenantใซใ‚ˆใ‚‹ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใƒฌใƒ™ใƒซใฎๅˆ†้›ข
  • ๐ŸŽซ ๆŸ”่ปŸใชใƒฆใƒผใ‚ถใƒผ็™ป้Œฒ - ใ‚ชใƒผใƒ—ใƒณ/ใƒ›ใƒฏใ‚คใƒˆใƒชใ‚นใƒˆ/ๆ‰ฟ่ชๅˆถใฎ3ใƒขใƒผใƒ‰
  • ๐Ÿ“– Open Library้€ฃๆบ - ISBNใ‹ใ‚‰่‡ชๅ‹•ใงๆ›ธ็ฑๆƒ…ๅ ฑใ‚’ๅ–ๅพ—
  • ๐Ÿ“ฑ ISBNใ‚นใ‚ญใƒฃใƒณ - ใ‚ซใƒกใƒฉใ‚’ไฝฟใฃใŸใƒใƒผใ‚ณใƒผใƒ‰ใ‚นใ‚ญใƒฃใƒณ
  • ๐Ÿ”‘ ๆจฉ้™็ฎก็† - ใใ‚็ดฐใ‹ใ„ใƒญใƒผใƒซใƒปๆจฉ้™ใ‚ทใ‚นใƒ†ใƒ 
  • ๐Ÿš€ Aspireๅฏพๅฟœ - ้–‹็™บ็’ฐๅขƒใ‚’ใƒฏใƒณใ‚ณใƒžใƒณใƒ‰ใง่ตทๅ‹•

๐Ÿ–ผ๏ธ ใ‚นใ‚ฏใƒชใƒผใƒณใ‚ทใƒงใƒƒใƒˆ

ๆ›ธ็ฑไธ€่ฆง ่ฒธๅ‡บไธ€่ฆง
ๆ›ธ็ฑ็ฎก็† ่ฒธๅ‡บ็ฎก็†

๐Ÿ—๏ธ ใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒใƒฃ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                        SvelteKit SPA                        โ”‚
โ”‚                    (Static Site + ZXing)                    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                              โ”‚
                              โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                  ASP.NET Core Web API                       โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚   Tenant    โ”‚  โ”‚    Book     โ”‚  โ”‚      Rental         โ”‚ โ”‚
โ”‚  โ”‚ Controller  โ”‚  โ”‚ Controller  โ”‚  โ”‚    Controller       โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚              Finbuckle.MultiTenant                      โ”‚ โ”‚
โ”‚  โ”‚              + Permission Filters                       โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                              โ”‚
                              โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                     PostgreSQL                              โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚  Tenant A   โ”‚  โ”‚  Tenant B   โ”‚  โ”‚     Tenant C        โ”‚ โ”‚
โ”‚  โ”‚  (RLS)      โ”‚  โ”‚  (RLS)      โ”‚  โ”‚      (RLS)          โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿš€ ใ‚ฏใ‚คใƒƒใ‚ฏใ‚นใ‚ฟใƒผใƒˆ

ๅ‰ๆๆกไปถ

ใƒ„ใƒผใƒซ ใƒใƒผใ‚ธใƒงใƒณ ใƒชใƒณใ‚ฏ
.NET SDK 10.0+ ใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰
Node.js 20+ ใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰
Docker ๆœ€ๆ–ฐ ใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰
PostgreSQL 17+ ใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰

1๏ธโƒฃ ใ‚ฏใƒญใƒผใƒณ

git clone https://github.com/your-org/OpenLibraryRent.git
cd OpenLibraryRent

2๏ธโƒฃ ่จญๅฎš

OpenLibraryRent/appsettings.Development.json ใ‚’ไฝœๆˆ๏ผš

{
  "ConnectionStrings": {
    "DefaultConnection": "Host=localhost;Database=openlibraryrent;Username=postgres;Password=postgres"
  },
  "Authentication": {
    "Microsoft": {
      "ClientId": "your-client-id",
      "ClientSecret": "your-client-secret"
    }
  },
  "Encryption": {
    "Key": "your-32-character-encryption-key!!"
  }
}

3๏ธโƒฃ ่ตทๅ‹•

Aspireใ‚’ไฝฟ็”จ๏ผˆๆŽจๅฅจ๏ผ‰๏ผš

dotnet run --project OpenLibraryRent.AppHost

็›ดๆŽฅ่ตทๅ‹•๏ผš

cd OpenLibraryRent
dotnet ef database update
dotnet run

4๏ธโƒฃ ใ‚ขใ‚ฏใ‚ปใ‚น


๐Ÿ“‹ ๆฉŸ่ƒฝ่ฉณ็ดฐ

ใƒฆใƒผใ‚ถใƒผ็™ป้Œฒใƒขใƒผใƒ‰

ใƒขใƒผใƒ‰ ่ชฌๆ˜Ž ใƒ›ใƒฏใ‚คใƒˆใƒชใ‚นใƒˆใƒฆใƒผใ‚ถใƒผ
๐Ÿ”“ Public ่ชฐใงใ‚‚ใƒญใ‚ฐใ‚คใƒณๅฏ่ƒฝ -
๐Ÿ”’ Private ใƒ›ใƒฏใ‚คใƒˆใƒชใ‚นใƒˆใฎใฟ่จฑๅฏ ๅณๅบงใซใƒญใ‚ฐใ‚คใƒณๅฏ่ƒฝ
๐Ÿ“ Approval ็”ณ่ซ‹โ†’ๆ‰ฟ่ชๅˆถ ๆ‰ฟ่ชใ‚นใ‚ญใƒƒใƒ—ใงใƒญใ‚ฐใ‚คใƒณ
graph LR
    A[ใƒฆใƒผใ‚ถใƒผใƒญใ‚ฐใ‚คใƒณ] --> B{็™ป้Œฒใƒขใƒผใƒ‰?}
    B -->|Public| C[ใƒญใ‚ฐใ‚คใƒณๆˆๅŠŸ]
    B -->|Private| D{ใƒ›ใƒฏใ‚คใƒˆใƒชใ‚นใƒˆ?}
    D -->|Yes| C
    D -->|No| E[ๆ‹’ๅฆ]
    B -->|Approval| F{ใƒ›ใƒฏใ‚คใƒˆใƒชใ‚นใƒˆ?}
    F -->|Yes| C
    F -->|No| G{ๆ‰ฟ่ชๆธˆใฟ?}
    G -->|Yes| C
    G -->|No| H[็”ณ่ซ‹็”ป้ขใธ]
Loading

ๆจฉ้™ใ‚ทใ‚นใƒ†ใƒ 

ใƒ†ใƒŠใƒณใƒˆๆจฉ้™

ๆจฉ้™ ่ชฌๆ˜Ž
tenant.user.read ใƒฆใƒผใ‚ถใƒผไธ€่ฆงใƒป่ฉณ็ดฐ้–ฒ่ฆง
tenant.user.manage ใƒฆใƒผใ‚ถใƒผไฝœๆˆใƒป็ทจ้›†ใƒปๅ‰Š้™ค
tenant.role.read ใƒญใƒผใƒซ้–ฒ่ฆง
tenant.role.manage ใƒญใƒผใƒซไฝœๆˆใƒป็ทจ้›†ใƒปๅ‰Š้™ค
tenant.book.read ๆ›ธ็ฑ้–ฒ่ฆง
tenant.book.manage ๆ›ธ็ฑ็™ป้Œฒใƒป็ทจ้›†
tenant.rental.read ่ฒธๅ‡บ้–ฒ่ฆง
tenant.rental.manage ่ฒธๅ‡บใƒป่ฟ”ๅดๆ“ไฝœ

ใ‚ทใ‚นใƒ†ใƒ ๆจฉ้™

ๆจฉ้™ ่ชฌๆ˜Ž
system.tenant.create ใƒ†ใƒŠใƒณใƒˆไฝœๆˆ
system.tenant.read ใƒ†ใƒŠใƒณใƒˆไธ€่ฆง้–ฒ่ฆง
system.tenant.manage ใƒ†ใƒŠใƒณใƒˆ่จญๅฎšๅค‰ๆ›ด
system.tenant.delete ใƒ†ใƒŠใƒณใƒˆๅ‰Š้™ค

๐Ÿ“ ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆๆง‹ๆˆ

OpenLibraryRent/
โ”œโ”€โ”€ ๐Ÿ“‚ OpenLibraryRent.AppHost/       # Aspireใƒ›ใ‚นใƒˆ
โ”‚   โ””โ”€โ”€ AppHost.cs                    # ใ‚คใƒณใƒ•ใƒฉๅฎš็พฉ
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ OpenLibraryRent.ServiceDefaults/ # ๅ…ฑ้€š่จญๅฎš
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ OpenLibraryRent/               # ใƒกใ‚คใƒณใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆ
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ Controllers/
โ”‚   โ”‚   โ”œโ”€โ”€ AuthController.cs         # ่ช่จผ
โ”‚   โ”‚   โ”œโ”€โ”€ TenantsController.cs      # ใƒ†ใƒŠใƒณใƒˆ็ฎก็†
โ”‚   โ”‚   โ”œโ”€โ”€ BooksController.cs        # ๆ›ธ็ฑAPI
โ”‚   โ”‚   โ”œโ”€โ”€ RentalsController.cs      # ่ฒธๅ‡บAPI
โ”‚   โ”‚   โ”œโ”€โ”€ UsersController.cs        # ใƒฆใƒผใ‚ถใƒผ็ฎก็†
โ”‚   โ”‚   โ”œโ”€โ”€ UserApprovalController.cs # ๆ‰ฟ่ชใƒ•ใƒญใƒผ
โ”‚   โ”‚   โ””โ”€โ”€ SystemAuthController.cs   # ใ‚ทใ‚นใƒ†ใƒ ่ช่จผ
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ Models/
โ”‚   โ”‚   โ”œโ”€โ”€ ApplicationUser.cs        # ใƒฆใƒผใ‚ถใƒผ
โ”‚   โ”‚   โ”œโ”€โ”€ ApplicationTenantInfo.cs  # ใƒ†ใƒŠใƒณใƒˆ
โ”‚   โ”‚   โ”œโ”€โ”€ Book.cs / BookCopy.cs     # ๆ›ธ็ฑ
โ”‚   โ”‚   โ”œโ”€โ”€ Rental.cs                 # ่ฒธๅ‡บ
โ”‚   โ”‚   โ””โ”€โ”€ UserApprovalRequest.cs    # ๆ‰ฟ่ชใƒชใ‚ฏใ‚จใ‚นใƒˆ
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ Services/
โ”‚   โ”‚   โ”œโ”€โ”€ TenantManagementService.cs
โ”‚   โ”‚   โ”œโ”€โ”€ RentalService.cs
โ”‚   โ”‚   โ”œโ”€โ”€ OpenLibraryService.cs     # Open Library API
โ”‚   โ”‚   โ””โ”€โ”€ EncryptionService.cs
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ Filters/
โ”‚   โ”‚   โ”œโ”€โ”€ RequireAnyAttribute.cs    # ORๆกไปถๆจฉ้™
โ”‚   โ”‚   โ””โ”€โ”€ RequireAllAttribute.cs    # ANDๆกไปถๆจฉ้™
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ OpenLibraryRent.Client/    # SvelteKitใƒ•ใƒญใƒณใƒˆใ‚จใƒณใƒ‰
โ”‚   โ”‚   โ”œโ”€โ”€ src/routes/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ [tenant]/             # ใƒ†ใƒŠใƒณใƒˆๅˆฅใƒšใƒผใ‚ธ
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ books/            # ๆ›ธ็ฑ็ฎก็†
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ rentals/          # ่ฒธๅ‡บ็ฎก็†
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ users/            # ใƒฆใƒผใ‚ถใƒผ็ฎก็†
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ apply/            # ็”ณ่ซ‹ใƒ•ใ‚ฉใƒผใƒ 
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ admin/approvals/  # ๆ‰ฟ่ช็ฎก็†
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ create-tenant/        # ใƒ†ใƒŠใƒณใƒˆไฝœๆˆ
โ”‚   โ”‚   โ””โ”€โ”€ src/lib/
โ”‚   โ”‚       โ”œโ”€โ”€ stores/auth.ts        # ่ช่จผใ‚นใƒˆใ‚ข
โ”‚   โ”‚       โ””โ”€โ”€ components/           # UIใ‚ณใƒณใƒใƒผใƒใƒณใƒˆ
โ”‚   โ”‚
โ”‚   โ””โ”€โ”€ ๐Ÿ“‚ Migrations/                # EF Coreใƒžใ‚คใ‚ฐใƒฌใƒผใ‚ทใƒงใƒณ
โ”‚
โ””โ”€โ”€ ๐Ÿ“‚ submodules/MaskedUUID/         # UUIDใƒžใ‚นใ‚ญใƒณใ‚ฐ

๐Ÿ”Œ API ใƒชใƒ•ใ‚กใƒฌใƒณใ‚น

่ช่จผ

GET  /{tenant}/auth/login          # OIDCใƒญใ‚ฐใ‚คใƒณ้–‹ๅง‹
GET  /{tenant}/auth/me             # ็พๅœจใฎใƒฆใƒผใ‚ถใƒผๆƒ…ๅ ฑ
POST /{tenant}/auth/logout         # ใƒญใ‚ฐใ‚ขใ‚ฆใƒˆ

ใ‚ทใ‚นใƒ†ใƒ ่ช่จผ๏ผˆใƒ†ใƒŠใƒณใƒˆไฝœๆˆ็”จ๏ผ‰

GET  /api/systemauth/microsoft-login   # Microsoft OAuth้–‹ๅง‹
GET  /api/systemauth/check             # ่ช่จผ็Šถๆ…‹็ขบ่ช

ใƒ†ใƒŠใƒณใƒˆ

GET  /api/tenants                      # ไธ€่ฆง๏ผˆใ‚ทใ‚นใƒ†ใƒ ็ฎก็†่€…๏ผ‰
GET  /api/tenants/by-identifier/{id}   # ่ญ˜ๅˆฅๅญใงๅ–ๅพ—
POST /api/tenants/create               # ไฝœๆˆ๏ผˆMicrosoft่ช่จผๅฟ…่ฆ๏ผ‰
PUT  /api/tenants/{id}/registration-settings  # ็™ป้Œฒ่จญๅฎšๆ›ดๆ–ฐ

ๆ›ธ็ฑ

GET  /{tenant}/api/books                           # ไธ€่ฆง
POST /{tenant}/api/books                           # ็™ป้Œฒ
POST /{tenant}/api/books/fetch-from-openlibrary/{isbn}  # Open Libraryๅ–ๅพ—
GET  /{tenant}/api/books/{id}/copies               # ๆ›ธ็ฑใ‚ณใƒ”ใƒผไธ€่ฆง

่ฒธๅ‡บ

GET  /{tenant}/api/rentals                # ไธ€่ฆง
POST /{tenant}/api/rentals/borrow         # ่ฒธๅ‡บ
POST /{tenant}/api/rentals/{id}/return    # ่ฟ”ๅด
GET  /{tenant}/api/rentals/overdue        # ๅปถๆปžไธ€่ฆง

ใƒฆใƒผใ‚ถใƒผๆ‰ฟ่ช

POST /{tenant}/api/userapproval/apply               # ็”ณ่ซ‹้€ไฟก
GET  /{tenant}/api/userapproval/status              # ใ‚นใƒ†ใƒผใ‚ฟใ‚น็ขบ่ช
GET  /{tenant}/api/userapproval/requests            # ็”ณ่ซ‹ไธ€่ฆง๏ผˆ็ฎก็†่€…๏ผ‰
POST /{tenant}/api/userapproval/requests/{id}/approve  # ๆ‰ฟ่ช
POST /{tenant}/api/userapproval/requests/{id}/reject   # ๅดไธ‹

โš™๏ธ ็’ฐๅขƒๅค‰ๆ•ฐ

ๅค‰ๆ•ฐๅ ๅฟ…้ ˆ ่ชฌๆ˜Ž
ConnectionStrings__DefaultConnection โœ… PostgreSQLๆŽฅ็ถšๆ–‡ๅญ—ๅˆ—
Authentication__Microsoft__ClientId โœ… Microsoft OAuth Client ID
Authentication__Microsoft__ClientSecret โœ… Microsoft OAuth Client Secret
Encryption__Key โœ… ๆš—ๅทๅŒ–ใ‚ญใƒผ๏ผˆ32ๆ–‡ๅญ—๏ผ‰
Cors__AllowedOrigins CORS่จฑๅฏใ‚ชใƒชใ‚ธใƒณ๏ผˆๆœฌ็•ชๅฟ…้ ˆ๏ผ‰

๐Ÿ”ง ่จญๅฎšไพ‹

Microsoft OAuth่จญๅฎš

  1. Azure Portal โ†’ ใ‚ขใƒ—ใƒชใฎ็™ป้Œฒ
  2. ๆ–ฐ่ฆ็™ป้Œฒ
    • ๅๅ‰: OpenLibraryRent
    • ใƒชใƒ€ใ‚คใƒฌใ‚ฏใƒˆURI: https://your-domain/auth/microsoft-callback
  3. ClientId ใจ ClientSecret ใ‚’ๅ–ๅพ—

็”ณ่ซ‹ใƒ•ใ‚ฉใƒผใƒ ใฎใ‚ซใ‚นใ‚ฟใƒžใ‚คใ‚บ

ใƒ†ใƒŠใƒณใƒˆ่จญๅฎšใง JSON ใงใƒ•ใ‚ฃใƒผใƒซใƒ‰ๅฎš็พฉ๏ผš

[
  {"name": "department", "label": "้ƒจ็ฝฒๅ", "type": "text", "required": true},
  {"name": "employee_id", "label": "็คพๅ“ก็•ชๅท", "type": "text", "required": true},
  {"name": "reason", "label": "ๅˆฉ็”จ็›ฎ็š„", "type": "textarea", "required": false}
]

๐Ÿงช ใƒ†ใ‚นใƒˆ

# ๅ˜ไฝ“ใƒ†ใ‚นใƒˆ
dotnet test

# ใƒ•ใƒญใƒณใƒˆใ‚จใƒณใƒ‰ๅž‹ใƒใ‚งใƒƒใ‚ฏ
cd OpenLibraryRent/OpenLibraryRent.Client
npm run check

๐Ÿ“ฆ ใƒ‡ใƒ—ใƒญใ‚ค

Docker Compose

version: '3.8'
services:
  app:
    image: openlibraryrent:latest
    environment:
      - ConnectionStrings__DefaultConnection=Host=postgres;Database=openlibraryrent;Username=postgres;Password=postgres
      - Authentication__Microsoft__ClientId=${MS_CLIENT_ID}
      - Authentication__Microsoft__ClientSecret=${MS_CLIENT_SECRET}
      - Encryption__Key=${ENCRYPTION_KEY}
    ports:
      - "5000:8080"
    depends_on:
      - postgres

  postgres:
    image: postgres:17
    environment:
      POSTGRES_PASSWORD: postgres
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  postgres-data:

๐Ÿค ใ‚ณใƒณใƒˆใƒชใƒ“ใƒฅใƒผใƒˆ

  1. ใƒ•ใ‚ฉใƒผใ‚ฏ
  2. ใƒ–ใƒฉใƒณใƒไฝœๆˆ (git checkout -b feature/amazing)
  3. ใ‚ณใƒŸใƒƒใƒˆ (git commit -m 'Add amazing feature')
  4. ใƒ—ใƒƒใ‚ทใƒฅ (git push origin feature/amazing)
  5. ใƒ—ใƒซใƒชใ‚ฏใ‚จใ‚นใƒˆไฝœๆˆ

๐Ÿ“„ ใƒฉใ‚คใ‚ปใƒณใ‚น

ใ“ใฎใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใฏ MIT License ใฎไธ‹ใงๅ…ฌ้–‹ใ•ใ‚Œใฆใ„ใพใ™ใ€‚


Made with โค๏ธ by Your Team

โฌ† ใƒˆใƒƒใƒ—ใซๆˆปใ‚‹