From 54ded7e5a76a105028b427fd2256606ce28f695d Mon Sep 17 00:00:00 2001 From: LydiaMuaCai Date: Thu, 7 Aug 2025 21:18:44 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=85=8D=E8=B4=B9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E9=99=90=E5=88=B6=20100?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/domain/user.go | 2 ++ backend/internal/user/handler/v1/user.go | 17 +++++++++++++++++ backend/internal/user/repo/user.go | 8 ++++++++ backend/internal/user/usecase/user.go | 4 ++++ backend/pro | 2 +- 5 files changed, 32 insertions(+), 1 deletion(-) diff --git a/backend/domain/user.go b/backend/domain/user.go index 6f4e3c3..647f557 100644 --- a/backend/domain/user.go +++ b/backend/domain/user.go @@ -33,6 +33,7 @@ type UserUsecase interface { OAuthCallback(ctx *web.Context, req *OAuthCallbackReq) error ExportCompletionData(ctx context.Context) (*ExportCompletionDataResp, error) GetUserByApiKey(ctx context.Context, apiKey string) (*db.User, error) + GetUserCount(ctx context.Context) (int64, error) } type UserRepo interface { @@ -60,6 +61,7 @@ type UserRepo interface { SaveAdminLoginHistory(ctx context.Context, adminID, ip string) error SaveUserLoginHistory(ctx context.Context, userID, ip string, session *VSCodeSession) error ExportCompletionData(ctx context.Context) ([]*CompletionData, error) + GetUserCount(ctx context.Context) (int64, error) } type ProfileUpdateReq struct { diff --git a/backend/internal/user/handler/v1/user.go b/backend/internal/user/handler/v1/user.go index fff83df..d5378c4 100644 --- a/backend/internal/user/handler/v1/user.go +++ b/backend/internal/user/handler/v1/user.go @@ -431,6 +431,23 @@ func (h *UserHandler) LoginHistory(c *web.Context) error { // @Router /api/v1/user/invite [get] func (h *UserHandler) Invite(c *web.Context) error { user := middleware.GetAdmin(c) + + edition := c.Get("edition") + if edition == nil { + return errcode.ErrPermission + } + + // 如果是 Free 版本 user 表不允许超过 100 人 + if edition.(int) == 0 { + count, err := h.usecase.GetUserCount(c.Request().Context()) + if err != nil { + return err + } + if count >= 100 { + return errcode.ErrUserLimit + } + } + resp, err := h.usecase.Invite(c.Request().Context(), user.ID) if err != nil { return err diff --git a/backend/internal/user/repo/user.go b/backend/internal/user/repo/user.go index b6e9fa2..b29db67 100644 --- a/backend/internal/user/repo/user.go +++ b/backend/internal/user/repo/user.go @@ -603,3 +603,11 @@ func (r *UserRepo) ExportCompletionData(ctx context.Context) ([]*domain.Completi return result, nil } + +func (r *UserRepo) GetUserCount(ctx context.Context) (int64, error) { + count, err := r.db.User.Query().Count(ctx) + if err != nil { + return 0, err + } + return int64(count), nil +} diff --git a/backend/internal/user/usecase/user.go b/backend/internal/user/usecase/user.go index 1ecf7b6..5b3ab6b 100644 --- a/backend/internal/user/usecase/user.go +++ b/backend/internal/user/usecase/user.go @@ -686,3 +686,7 @@ func (u *UserUsecase) ExportCompletionData(ctx context.Context) (*domain.ExportC Data: data, }, nil } + +func (u *UserUsecase) GetUserCount(ctx context.Context) (int64, error) { + return u.repo.GetUserCount(ctx) +} diff --git a/backend/pro b/backend/pro index 5c13297..cb3420b 160000 --- a/backend/pro +++ b/backend/pro @@ -1 +1 @@ -Subproject commit 5c132972b36eb375a8c0067305ba5cec568b58b3 +Subproject commit cb3420b603e9250d6ed20eb3a9b0ce05299ddd40