diff --git a/TakeoutSaaS.sln b/TakeoutSaaS.sln
index 1c33d44..08719a4 100644
--- a/TakeoutSaaS.sln
+++ b/TakeoutSaaS.sln
@@ -31,10 +31,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TakeoutSaaS.Module.Authoriz
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TakeoutSaaS.Module.Tenancy", "src\Modules\TakeoutSaaS.Module.Tenancy\TakeoutSaaS.Module.Tenancy.csproj", "{5B1DAF2B-C36C-4CB1-9452-81D5D6F79D38}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TakeoutSaaS.MiniApi", "src\Api\TakeoutSaaS.MiniApi\TakeoutSaaS.MiniApi.csproj", "{12ECF33A-D5E3-4F8B-A9D9-60F7F55B869D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TakeoutSaaS.UserApi", "src\Api\TakeoutSaaS.UserApi\TakeoutSaaS.UserApi.csproj", "{1C0BCC51-AF18-44F3-A1E6-A693F74276B5}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TakeoutSaaS.Shared.Kernel", "TakeoutSaaS.BuildingBlocks\src\Core\TakeoutSaaS.Shared.Kernel\TakeoutSaaS.Shared.Kernel.csproj", "{BBC99B58-ECA8-42C3-9070-9AA058D778D3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TakeoutSaaS.Module.Storage", "src\Modules\TakeoutSaaS.Module.Storage\TakeoutSaaS.Module.Storage.csproj", "{05058F44-6FB7-43AF-8648-8BF538E283EF}"
@@ -55,6 +51,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TakeoutSaaS.Application.Tes
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TakeoutSaaS.Integration.Tests", "tests\TakeoutSaaS.Integration.Tests\TakeoutSaaS.Integration.Tests.csproj", "{8179CA95-33F8-45F2-BA29-9B1CC7D1E7CB}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TakeoutSaaS.TenantApi", "src\Api\TakeoutSaaS.TenantApi\TakeoutSaaS.TenantApi.csproj", "{F53E274A-838A-477A-8D29-6EEB0DBD62CD}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -149,30 +147,6 @@ Global
{5B1DAF2B-C36C-4CB1-9452-81D5D6F79D38}.Release|x64.Build.0 = Release|Any CPU
{5B1DAF2B-C36C-4CB1-9452-81D5D6F79D38}.Release|x86.ActiveCfg = Release|Any CPU
{5B1DAF2B-C36C-4CB1-9452-81D5D6F79D38}.Release|x86.Build.0 = Release|Any CPU
- {12ECF33A-D5E3-4F8B-A9D9-60F7F55B869D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {12ECF33A-D5E3-4F8B-A9D9-60F7F55B869D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {12ECF33A-D5E3-4F8B-A9D9-60F7F55B869D}.Debug|x64.ActiveCfg = Debug|Any CPU
- {12ECF33A-D5E3-4F8B-A9D9-60F7F55B869D}.Debug|x64.Build.0 = Debug|Any CPU
- {12ECF33A-D5E3-4F8B-A9D9-60F7F55B869D}.Debug|x86.ActiveCfg = Debug|Any CPU
- {12ECF33A-D5E3-4F8B-A9D9-60F7F55B869D}.Debug|x86.Build.0 = Debug|Any CPU
- {12ECF33A-D5E3-4F8B-A9D9-60F7F55B869D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {12ECF33A-D5E3-4F8B-A9D9-60F7F55B869D}.Release|Any CPU.Build.0 = Release|Any CPU
- {12ECF33A-D5E3-4F8B-A9D9-60F7F55B869D}.Release|x64.ActiveCfg = Release|Any CPU
- {12ECF33A-D5E3-4F8B-A9D9-60F7F55B869D}.Release|x64.Build.0 = Release|Any CPU
- {12ECF33A-D5E3-4F8B-A9D9-60F7F55B869D}.Release|x86.ActiveCfg = Release|Any CPU
- {12ECF33A-D5E3-4F8B-A9D9-60F7F55B869D}.Release|x86.Build.0 = Release|Any CPU
- {1C0BCC51-AF18-44F3-A1E6-A693F74276B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {1C0BCC51-AF18-44F3-A1E6-A693F74276B5}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {1C0BCC51-AF18-44F3-A1E6-A693F74276B5}.Debug|x64.ActiveCfg = Debug|Any CPU
- {1C0BCC51-AF18-44F3-A1E6-A693F74276B5}.Debug|x64.Build.0 = Debug|Any CPU
- {1C0BCC51-AF18-44F3-A1E6-A693F74276B5}.Debug|x86.ActiveCfg = Debug|Any CPU
- {1C0BCC51-AF18-44F3-A1E6-A693F74276B5}.Debug|x86.Build.0 = Debug|Any CPU
- {1C0BCC51-AF18-44F3-A1E6-A693F74276B5}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {1C0BCC51-AF18-44F3-A1E6-A693F74276B5}.Release|Any CPU.Build.0 = Release|Any CPU
- {1C0BCC51-AF18-44F3-A1E6-A693F74276B5}.Release|x64.ActiveCfg = Release|Any CPU
- {1C0BCC51-AF18-44F3-A1E6-A693F74276B5}.Release|x64.Build.0 = Release|Any CPU
- {1C0BCC51-AF18-44F3-A1E6-A693F74276B5}.Release|x86.ActiveCfg = Release|Any CPU
- {1C0BCC51-AF18-44F3-A1E6-A693F74276B5}.Release|x86.Build.0 = Release|Any CPU
{BBC99B58-ECA8-42C3-9070-9AA058D778D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BBC99B58-ECA8-42C3-9070-9AA058D778D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BBC99B58-ECA8-42C3-9070-9AA058D778D3}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -281,6 +255,18 @@ Global
{8179CA95-33F8-45F2-BA29-9B1CC7D1E7CB}.Release|x64.Build.0 = Release|Any CPU
{8179CA95-33F8-45F2-BA29-9B1CC7D1E7CB}.Release|x86.ActiveCfg = Release|Any CPU
{8179CA95-33F8-45F2-BA29-9B1CC7D1E7CB}.Release|x86.Build.0 = Release|Any CPU
+ {F53E274A-838A-477A-8D29-6EEB0DBD62CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F53E274A-838A-477A-8D29-6EEB0DBD62CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F53E274A-838A-477A-8D29-6EEB0DBD62CD}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F53E274A-838A-477A-8D29-6EEB0DBD62CD}.Debug|x64.Build.0 = Debug|Any CPU
+ {F53E274A-838A-477A-8D29-6EEB0DBD62CD}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F53E274A-838A-477A-8D29-6EEB0DBD62CD}.Debug|x86.Build.0 = Debug|Any CPU
+ {F53E274A-838A-477A-8D29-6EEB0DBD62CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F53E274A-838A-477A-8D29-6EEB0DBD62CD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F53E274A-838A-477A-8D29-6EEB0DBD62CD}.Release|x64.ActiveCfg = Release|Any CPU
+ {F53E274A-838A-477A-8D29-6EEB0DBD62CD}.Release|x64.Build.0 = Release|Any CPU
+ {F53E274A-838A-477A-8D29-6EEB0DBD62CD}.Release|x86.ActiveCfg = Release|Any CPU
+ {F53E274A-838A-477A-8D29-6EEB0DBD62CD}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -299,8 +285,6 @@ Global
{EC447DCF-ABFA-6E24-52A5-D7FD48A5C558} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{6CB8487D-5C74-487C-9D84-E57838BDA015} = {EC447DCF-ABFA-6E24-52A5-D7FD48A5C558}
{5B1DAF2B-C36C-4CB1-9452-81D5D6F79D38} = {EC447DCF-ABFA-6E24-52A5-D7FD48A5C558}
- {12ECF33A-D5E3-4F8B-A9D9-60F7F55B869D} = {81034408-37C8-1011-444E-4C15C2FADA8E}
- {1C0BCC51-AF18-44F3-A1E6-A693F74276B5} = {81034408-37C8-1011-444E-4C15C2FADA8E}
{BBC99B58-ECA8-42C3-9070-9AA058D778D3} = {8D626EA8-CB54-BC41-363A-217881BEBA6E}
{05058F44-6FB7-43AF-8648-8BF538E283EF} = {EC447DCF-ABFA-6E24-52A5-D7FD48A5C558}
{5C12177E-6C25-4F78-BFD4-AA073CFC0650} = {EC447DCF-ABFA-6E24-52A5-D7FD48A5C558}
@@ -310,5 +294,6 @@ Global
{38011EC3-7EC3-40E4-B9B2-E631966B350B} = {EC447DCF-ABFA-6E24-52A5-D7FD48A5C558}
{2601637E-777A-4FA2-81BA-1AFE32E961FF} = {0AB3BF05-4346-4AA6-1389-037BE0695223}
{8179CA95-33F8-45F2-BA29-9B1CC7D1E7CB} = {0AB3BF05-4346-4AA6-1389-037BE0695223}
+ {F53E274A-838A-477A-8D29-6EEB0DBD62CD} = {81034408-37C8-1011-444E-4C15C2FADA8E}
EndGlobalSection
EndGlobal
diff --git a/src/Api/TakeoutSaaS.MiniApi/Contracts/Requests/FileUploadFormRequest.cs b/src/Api/TakeoutSaaS.MiniApi/Contracts/Requests/FileUploadFormRequest.cs
deleted file mode 100644
index 8cc3e95..0000000
--- a/src/Api/TakeoutSaaS.MiniApi/Contracts/Requests/FileUploadFormRequest.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System.ComponentModel.DataAnnotations;
-using Microsoft.AspNetCore.Http;
-
-namespace TakeoutSaaS.MiniApi.Contracts.Requests;
-
-///
-/// 文件上传表单请求。
-///
-public sealed record FileUploadFormRequest
-{
- ///
- /// 上传文件。
- ///
- [Required]
- public required IFormFile File { get; init; }
- ///
- /// 上传类型。
- ///
- public string? Type { get; init; }
-}
diff --git a/src/Api/TakeoutSaaS.MiniApi/Controllers/.gitkeep b/src/Api/TakeoutSaaS.MiniApi/Controllers/.gitkeep
deleted file mode 100644
index 8b13789..0000000
--- a/src/Api/TakeoutSaaS.MiniApi/Controllers/.gitkeep
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/Api/TakeoutSaaS.MiniApi/Controllers/AuthController.cs b/src/Api/TakeoutSaaS.MiniApi/Controllers/AuthController.cs
deleted file mode 100644
index 11e7d10..0000000
--- a/src/Api/TakeoutSaaS.MiniApi/Controllers/AuthController.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-using TakeoutSaaS.Application.Identity.Abstractions;
-using TakeoutSaaS.Application.Identity.Contracts;
-using TakeoutSaaS.Shared.Abstractions.Results;
-using TakeoutSaaS.Shared.Web.Api;
-
-namespace TakeoutSaaS.MiniApi.Controllers;
-
-///
-/// 小程序登录认证
-///
-/// 提供小程序端的微信登录与 Token 刷新能力。
-/// 小程序认证服务
-[ApiVersion("1.0")]
-[Authorize]
-[Route("api/mini/v{version:apiVersion}/auth")]
-public sealed class AuthController(IMiniAuthService authService) : BaseApiController
-{
- ///
- /// 微信登录
- ///
- /// 微信登录请求。
- /// 取消标记。
- /// 包含访问令牌与刷新令牌的响应。
- [HttpPost("wechat/login")]
- [AllowAnonymous]
- [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)]
- public async Task> LoginWithWeChat([FromBody] WeChatLoginRequest request, CancellationToken cancellationToken)
- {
- // 1. 调用认证服务完成微信登录
- var response = await authService.LoginWithWeChatAsync(request, cancellationToken);
-
- // 2. 返回访问与刷新令牌
- return ApiResponse.Ok(response);
- }
-
- ///
- /// 刷新 Token
- ///
- /// 刷新令牌请求。
- /// 取消标记。
- /// 新的访问令牌与刷新令牌。
- [HttpPost("refresh")]
- [AllowAnonymous]
- [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)]
- public async Task> RefreshToken([FromBody] RefreshTokenRequest request, CancellationToken cancellationToken)
- {
- // 1. 调用认证服务刷新 Token
- var response = await authService.RefreshTokenAsync(request, cancellationToken);
-
- // 2. 返回新的令牌
- return ApiResponse.Ok(response);
- }
-}
diff --git a/src/Api/TakeoutSaaS.MiniApi/Controllers/FilesController.cs b/src/Api/TakeoutSaaS.MiniApi/Controllers/FilesController.cs
deleted file mode 100644
index c06c440..0000000
--- a/src/Api/TakeoutSaaS.MiniApi/Controllers/FilesController.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-using TakeoutSaaS.Application.Storage.Abstractions;
-using TakeoutSaaS.Application.Storage.Contracts;
-using TakeoutSaaS.Application.Storage.Extensions;
-using TakeoutSaaS.Shared.Abstractions.Constants;
-using TakeoutSaaS.Shared.Abstractions.Results;
-using TakeoutSaaS.Shared.Web.Api;
-using TakeoutSaaS.MiniApi.Contracts.Requests;
-
-namespace TakeoutSaaS.MiniApi.Controllers;
-
-///
-/// 小程序文件上传。
-///
-[ApiVersion("1.0")]
-[Authorize]
-[Route("api/mini/v{version:apiVersion}/files")]
-public sealed class FilesController(IFileStorageService fileStorageService) : BaseApiController
-{
- ///
- /// 上传图片或文件。
- ///
- /// 表单请求,包含文件与类型。
- /// 取消标记。
- /// 上传结果,包含访问链接等信息。
- [HttpPost("upload")]
- [Consumes("multipart/form-data")]
- [RequestFormLimits(MultipartBodyLengthLimit = 30 * 1024 * 1024)]
- [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)]
- [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status400BadRequest)]
- public async Task> Upload([FromForm] FileUploadFormRequest request, CancellationToken cancellationToken)
- {
- // 1. 校验文件有效性
- if (request.File is null || request.File.Length == 0)
- {
- return ApiResponse.Error(ErrorCodes.BadRequest, "文件不能为空");
- }
- // 2. 解析上传类型
- if (!UploadFileTypeParser.TryParse(request.Type, out var uploadType))
- {
- return ApiResponse.Error(ErrorCodes.BadRequest, "上传类型不合法");
- }
- // 3. 提取请求来源
- var origin = Request.Headers["Origin"].FirstOrDefault() ?? Request.Headers["Referer"].FirstOrDefault();
- await using var stream = request.File.OpenReadStream();
- // 4. 调用存储服务执行上传
- var result = await fileStorageService.UploadAsync(
- new UploadFileRequest(uploadType, stream, request.File.FileName, request.File.ContentType ?? string.Empty, request.File.Length, origin),
- cancellationToken);
- // 5. 返回上传结果
- return ApiResponse.Ok(result);
- }
-}
diff --git a/src/Api/TakeoutSaaS.MiniApi/Controllers/MenusController.cs b/src/Api/TakeoutSaaS.MiniApi/Controllers/MenusController.cs
deleted file mode 100644
index 549db99..0000000
--- a/src/Api/TakeoutSaaS.MiniApi/Controllers/MenusController.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using System;
-using MediatR;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using TakeoutSaaS.Application.App.Products.Dto;
-using TakeoutSaaS.Application.App.Products.Queries;
-using TakeoutSaaS.Shared.Abstractions.Results;
-using TakeoutSaaS.Shared.Web.Api;
-
-namespace TakeoutSaaS.MiniApi.Controllers;
-
-///
-/// 小程序端菜单查询。
-///
-[ApiVersion("1.0")]
-[Authorize]
-[Route("api/mini/v{version:apiVersion}/stores/{storeId:long}/menu")]
-public sealed class MenusController(IMediator mediator) : BaseApiController
-{
- ///
- /// 获取门店菜单(含分类与商品详情)。
- ///
- [HttpGet]
- [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)]
- public async Task> GetMenu(long storeId, [FromQuery] DateTime? updatedAfter, CancellationToken cancellationToken)
- {
- // 1. 组装查询
- var query = new GetStoreMenuQuery
- {
- StoreId = storeId,
- UpdatedAfter = updatedAfter
- };
- // 2. 拉取菜单
- var result = await mediator.Send(query, cancellationToken);
- return ApiResponse.Ok(result);
- }
-}
diff --git a/src/Api/TakeoutSaaS.MiniApi/Controllers/PickupSlotsController.cs b/src/Api/TakeoutSaaS.MiniApi/Controllers/PickupSlotsController.cs
deleted file mode 100644
index 66ce98d..0000000
--- a/src/Api/TakeoutSaaS.MiniApi/Controllers/PickupSlotsController.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System;
-using MediatR;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using TakeoutSaaS.Application.App.Stores.Dto;
-using TakeoutSaaS.Application.App.Stores.Queries;
-using TakeoutSaaS.Shared.Abstractions.Results;
-using TakeoutSaaS.Shared.Web.Api;
-
-namespace TakeoutSaaS.MiniApi.Controllers;
-
-///
-/// 小程序端自提档期查询。
-///
-[ApiVersion("1.0")]
-[Authorize]
-[Route("api/mini/v{version:apiVersion}/stores/{storeId:long}/pickup-slots")]
-public sealed class PickupSlotsController(IMediator mediator) : BaseApiController
-{
- ///
- /// 获取指定日期可用档期。
- ///
- [HttpGet]
- [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status200OK)]
- public async Task>> GetSlots(long storeId, [FromQuery] DateTime date, CancellationToken cancellationToken)
- {
- var result = await mediator.Send(new GetAvailablePickupSlotsQuery { StoreId = storeId, Date = date }, cancellationToken);
- return ApiResponse>.Ok(result);
- }
-}
diff --git a/src/Api/TakeoutSaaS.MiniApi/Controllers/TablesController.cs b/src/Api/TakeoutSaaS.MiniApi/Controllers/TablesController.cs
deleted file mode 100644
index 504e35a..0000000
--- a/src/Api/TakeoutSaaS.MiniApi/Controllers/TablesController.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using System.Collections.Generic;
-using MediatR;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using TakeoutSaaS.Application.App.Stores.Dto;
-using TakeoutSaaS.Application.App.Stores.Queries;
-using TakeoutSaaS.Shared.Abstractions.Constants;
-using TakeoutSaaS.Shared.Abstractions.Results;
-using TakeoutSaaS.Shared.Web.Api;
-
-namespace TakeoutSaaS.MiniApi.Controllers;
-
-///
-/// 桌码上下文。
-///
-[ApiVersion("1.0")]
-[Authorize]
-[Route("api/mini/v{version:apiVersion}/tables")]
-public sealed class TablesController(IMediator mediator) : BaseApiController
-{
- ///
- /// 解析桌码并返回上下文。
- ///
- [HttpGet("{code}/context")]
- [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)]
- [ProducesResponseType(typeof(ApiResponse