From f004408ca04cf1411896c05fbfc2d1008ed4f3f2 Mon Sep 17 00:00:00 2001 From: shiran Date: Mon, 8 Jun 2026 15:45:25 +0800 Subject: [PATCH] refactor: remove user-level API methods, keep admin and send only Co-authored-by: Cursor --- client.go | 8 ++++---- quota.go | 21 -------------------- signature.go | 47 --------------------------------------------- template.go | 54 ---------------------------------------------------- token.go | 47 --------------------------------------------- types.go | 36 ----------------------------------- 6 files changed, 4 insertions(+), 209 deletions(-) diff --git a/client.go b/client.go index e3424f8..3520fbc 100644 --- a/client.go +++ b/client.go @@ -28,7 +28,7 @@ const ( // 构造方式: // - NewServiceClient: 管理端(自动调用 service-token-login 获取 Bearer Token) // - NewBearerClient: 管理端(使用已有的 Bearer Token) -// - NewUserTokenClient: 发送端(X-SMS-Token + 请求签名) +// - NewUserTokenClient: 发送端(X-SMS-Token + 请求签名,仅可调用发送接口) type Client struct { baseURL string mode authMode @@ -73,9 +73,9 @@ func NewServiceClient(baseURL, serviceToken string, opts ...Option) (*Client, er return c, nil } -// NewBearerClient 创建使用已有 Bearer Token 的客户端。 +// NewBearerClient 创建使用已有 Bearer Token 的管理端客户端。 // -// 适用于已通过其他方式获取 Bearer Token 的场景(如用户中心 Token)。 +// 适用于已通过 service-token-login 等方式获取 Bearer Token 的场景。 func NewBearerClient(baseURL, bearerToken string, opts ...Option) *Client { c := &Client{ baseURL: strings.TrimRight(baseURL, "/"), @@ -92,7 +92,7 @@ func NewBearerClient(baseURL, bearerToken string, opts ...Option) *Client { // NewUserTokenClient 创建发送端客户端。 // // 使用 X-SMS-Token 头认证,POST/PUT 请求体会自动计算 sign 签名。 -// 主要用于调用短信发送接口,也可管理当前用户的签名/模板/Token 等资源。 +// 仅可调用短信发送接口(SendBatch/SendMulti/ListSendRecords/GetSendStatus)。 func NewUserTokenClient(baseURL, userToken string, opts ...Option) *Client { c := &Client{ baseURL: strings.TrimRight(baseURL, "/"), diff --git a/quota.go b/quota.go index 5becde5..d8c9f29 100644 --- a/quota.go +++ b/quota.go @@ -5,27 +5,6 @@ import ( "fmt" ) -// ────────────────────────────────────────────── -// 用户接口 -// ────────────────────────────────────────────── - -// ListQuotas 获取当前用户的额度列表(分页)。 -// GET /api/sms/quota/list -func (c *Client) ListQuotas(ctx context.Context, q PaginationQuery) (PaginationResult[SmsQuota], error) { - params := paginationParams(q) - return get[PaginationResult[SmsQuota]](c, ctx, "/api/sms/quota/list", buildQuery(params)) -} - -// GetQuotaSummary 获取当前用户的额度汇总。 -// GET /api/sms/quota/summary -func (c *Client) GetQuotaSummary(ctx context.Context) (QuotaSummary, error) { - return get[QuotaSummary](c, ctx, "/api/sms/quota/summary", nil) -} - -// ────────────────────────────────────────────── -// 管理员接口 -// ────────────────────────────────────────────── - // AdminListQuotas 管理员获取额度列表,可按 UserID 筛选。 // GET /api/sms/admin/quota/list func (c *Client) AdminListQuotas(ctx context.Context, q QuotaListQuery) (PaginationResult[SmsQuota], error) { diff --git a/signature.go b/signature.go index 1619aef..ee815fa 100644 --- a/signature.go +++ b/signature.go @@ -5,53 +5,6 @@ import ( "fmt" ) -// ────────────────────────────────────────────── -// 用户接口 -// ────────────────────────────────────────────── - -// CreateSignature 创建短信签名。 -// POST /api/sms/signature -func (c *Client) CreateSignature(ctx context.Context, req CreateSignatureReq) (SmsSignature, error) { - return post[SmsSignature](c, ctx, "/api/sms/signature", req) -} - -// ListSignatures 获取当前用户的签名列表(分页)。 -// GET /api/sms/signature/list -func (c *Client) ListSignatures(ctx context.Context, q PaginationQuery) (PaginationResult[SmsSignature], error) { - params := paginationParams(q) - return get[PaginationResult[SmsSignature]](c, ctx, "/api/sms/signature/list", buildQuery(params)) -} - -// GetSignature 获取指定签名详情。 -// GET /api/sms/signature/:id -func (c *Client) GetSignature(ctx context.Context, id uint) (SmsSignature, error) { - return get[SmsSignature](c, ctx, fmt.Sprintf("/api/sms/signature/%d", id), nil) -} - -// UpdateSignature 更新指定签名。 -// PUT /api/sms/signature/:id -func (c *Client) UpdateSignature(ctx context.Context, id uint, req UpdateSignatureReq) (SmsSignature, error) { - return put[SmsSignature](c, ctx, fmt.Sprintf("/api/sms/signature/%d", id), req) -} - -// DeleteSignature 删除指定签名。 -// DELETE /api/sms/signature/:id -func (c *Client) DeleteSignature(ctx context.Context, id uint) error { - _, err := del[any](c, ctx, fmt.Sprintf("/api/sms/signature/%d", id)) - return err -} - -// SubmitSignature 提交签名进入审核。 -// POST /api/sms/signature/:id/submit -func (c *Client) SubmitSignature(ctx context.Context, id uint) error { - _, err := post[any](c, ctx, fmt.Sprintf("/api/sms/signature/%d/submit", id), nil) - return err -} - -// ────────────────────────────────────────────── -// 管理员接口 -// ────────────────────────────────────────────── - // AdminListSignatures 管理员获取签名列表,可按 UserID、Status 筛选。 // GET /api/sms/admin/signature/list func (c *Client) AdminListSignatures(ctx context.Context, q SignatureListQuery) (PaginationResult[SmsSignature], error) { diff --git a/template.go b/template.go index f90cb81..0df01e6 100644 --- a/template.go +++ b/template.go @@ -5,60 +5,6 @@ import ( "fmt" ) -// ────────────────────────────────────────────── -// 用户接口 -// ────────────────────────────────────────────── - -// CreateTemplate 创建短信模板。 -// POST /api/sms/template -func (c *Client) CreateTemplate(ctx context.Context, req CreateTemplateReq) (SmsTemplate, error) { - return post[SmsTemplate](c, ctx, "/api/sms/template", req) -} - -// ListTemplates 获取当前用户的模板列表(分页)。 -// GET /api/sms/template/list -func (c *Client) ListTemplates(ctx context.Context, q PaginationQuery) (PaginationResult[SmsTemplate], error) { - params := paginationParams(q) - return get[PaginationResult[SmsTemplate]](c, ctx, "/api/sms/template/list", buildQuery(params)) -} - -// GetTemplate 获取指定模板详情。 -// GET /api/sms/template/:id -func (c *Client) GetTemplate(ctx context.Context, id uint) (SmsTemplate, error) { - return get[SmsTemplate](c, ctx, fmt.Sprintf("/api/sms/template/%d", id), nil) -} - -// UpdateTemplate 更新指定模板。 -// PUT /api/sms/template/:id -func (c *Client) UpdateTemplate(ctx context.Context, id uint, req UpdateTemplateReq) (SmsTemplate, error) { - return put[SmsTemplate](c, ctx, fmt.Sprintf("/api/sms/template/%d", id), req) -} - -// DeleteTemplate 删除指定模板。 -// DELETE /api/sms/template/:id -func (c *Client) DeleteTemplate(ctx context.Context, id uint) error { - _, err := del[any](c, ctx, fmt.Sprintf("/api/sms/template/%d", id)) - return err -} - -// SubmitTemplate 提交模板进入审核。 -// POST /api/sms/template/:id/submit -func (c *Client) SubmitTemplate(ctx context.Context, id uint) error { - _, err := post[any](c, ctx, fmt.Sprintf("/api/sms/template/%d/submit", id), nil) - return err -} - -// ListRecommendedTemplates 获取推荐模板列表(分页)。 -// GET /api/sms/template/recommended -func (c *Client) ListRecommendedTemplates(ctx context.Context, q PaginationQuery) (PaginationResult[SmsRecommendedTemplate], error) { - params := paginationParams(q) - return get[PaginationResult[SmsRecommendedTemplate]](c, ctx, "/api/sms/template/recommended", buildQuery(params)) -} - -// ────────────────────────────────────────────── -// 管理员接口 -// ────────────────────────────────────────────── - // AdminListTemplates 管理员获取模板列表,可按 UserID、Status 筛选。 // GET /api/sms/admin/template/list func (c *Client) AdminListTemplates(ctx context.Context, q TemplateListQuery) (PaginationResult[SmsTemplate], error) { diff --git a/token.go b/token.go index a9af3dd..aed2cb4 100644 --- a/token.go +++ b/token.go @@ -5,53 +5,6 @@ import ( "fmt" ) -// ────────────────────────────────────────────── -// 用户接口 -// ────────────────────────────────────────────── - -// CreateUserToken 创建用户令牌。 -// POST /api/sms/token -func (c *Client) CreateUserToken(ctx context.Context, req CreateTokenReq) (SmsUserToken, error) { - return post[SmsUserToken](c, ctx, "/api/sms/token", req) -} - -// ListUserTokens 获取当前用户的令牌列表(分页)。 -// GET /api/sms/token/list -func (c *Client) ListUserTokens(ctx context.Context, q PaginationQuery) (PaginationResult[SmsUserToken], error) { - params := paginationParams(q) - return get[PaginationResult[SmsUserToken]](c, ctx, "/api/sms/token/list", buildQuery(params)) -} - -// GetUserToken 获取指定令牌详情。 -// GET /api/sms/token/:id -func (c *Client) GetUserToken(ctx context.Context, id uint) (SmsUserToken, error) { - return get[SmsUserToken](c, ctx, fmt.Sprintf("/api/sms/token/%d", id), nil) -} - -// UpdateUserToken 更新指定令牌。 -// PUT /api/sms/token/:id -func (c *Client) UpdateUserToken(ctx context.Context, id uint, req UpdateTokenReq) (SmsUserToken, error) { - return put[SmsUserToken](c, ctx, fmt.Sprintf("/api/sms/token/%d", id), req) -} - -// DeleteUserToken 删除指定令牌。 -// DELETE /api/sms/token/:id -func (c *Client) DeleteUserToken(ctx context.Context, id uint) error { - _, err := del[any](c, ctx, fmt.Sprintf("/api/sms/token/%d", id)) - return err -} - -// ToggleUserToken 切换令牌的启用/禁用状态。 -// POST /api/sms/token/:id/toggle -func (c *Client) ToggleUserToken(ctx context.Context, id uint) error { - _, err := post[any](c, ctx, fmt.Sprintf("/api/sms/token/%d/toggle", id), nil) - return err -} - -// ────────────────────────────────────────────── -// 管理员接口 -// ────────────────────────────────────────────── - // AdminListUserTokens 管理员获取令牌列表,可按 UserID、Status 筛选。 // GET /api/sms/admin/token/list func (c *Client) AdminListUserTokens(ctx context.Context, q TokenListQuery) (PaginationResult[SmsUserToken], error) { diff --git a/types.go b/types.go index 28e5be1..7681333 100644 --- a/types.go +++ b/types.go @@ -65,22 +65,6 @@ type SmsSignature struct { ReviewedAt *time.Time `json:"reviewed_at"` } -type CreateSignatureReq struct { - Title string `json:"title"` - ApplicantName string `json:"applicant_name"` - ApplicantIDCard string `json:"applicant_id_card,omitempty"` - ApplicantCompany string `json:"applicant_company,omitempty"` - LicenseURL string `json:"license_url,omitempty"` -} - -type UpdateSignatureReq struct { - Title string `json:"title,omitempty"` - ApplicantName string `json:"applicant_name,omitempty"` - ApplicantIDCard string `json:"applicant_id_card,omitempty"` - ApplicantCompany string `json:"applicant_company,omitempty"` - LicenseURL string `json:"license_url,omitempty"` -} - type AdminCreateSignatureReq struct { UserID uint `json:"user_id"` Title string `json:"title"` @@ -130,19 +114,6 @@ type SmsTemplate struct { ReviewedAt *time.Time `json:"reviewed_at"` } -type CreateTemplateReq struct { - Name string `json:"name"` - Content string `json:"content"` - Params []TemplateParam `json:"params,omitempty"` - RecommendedID *uint `json:"recommended_id,omitempty"` -} - -type UpdateTemplateReq struct { - Name string `json:"name,omitempty"` - Content string `json:"content,omitempty"` - Params []TemplateParam `json:"params,omitempty"` -} - type AdminCreateTemplateReq struct { UserID uint `json:"user_id"` Name string `json:"name"` @@ -203,13 +174,6 @@ type SmsUserToken struct { LastUsedIP string `json:"last_used_ip"` } -type CreateTokenReq struct { - Name string `json:"name,omitempty"` - QuotaLimit *int `json:"quota_limit,omitempty"` - TemplateIDs []uint `json:"template_ids,omitempty"` - ExpireAt string `json:"expire_at,omitempty"` -} - type UpdateTokenReq struct { Name string `json:"name,omitempty"` QuotaLimit *int `json:"quota_limit,omitempty"`