diff --git a/internal/logic/admin/audit.go b/internal/logic/admin/audit.go index e48c811..4096af8 100644 --- a/internal/logic/admin/audit.go +++ b/internal/logic/admin/audit.go @@ -129,6 +129,13 @@ func queryPage(ctx context.Context, table, fields, where, orderBy string, page, // ListOperationLogs retrieves a paginated list of operation logs with optional filters. func (s *sAdmin) ListOperationLogs(ctx context.Context, req *v1.OperationLogListReq) (*v1.OperationLogListRes, error) { + if err := common.ValidateDateParam(req.StartDate, "开始日期"); err != nil { + return nil, err + } + if err := common.ValidateDateParam(req.EndDate, "结束日期"); err != nil { + return nil, err + } + page, pageSize := common.NormalizePagination(req.Page, req.PageSize) var conditions []string @@ -230,6 +237,13 @@ func MaskSensitiveData(data string) string { // ListRequestAuditLogs 分页查询请求审计日志(不返回 request_body/response_body 以优化性能) func (s *sAdmin) ListRequestAuditLogs(ctx context.Context, req *v1.RequestAuditLogListReq) (*v1.RequestAuditLogListRes, error) { + if err := common.ValidateDateParam(req.StartDate, "开始日期"); err != nil { + return nil, err + } + if err := common.ValidateDateParam(req.EndDate, "结束日期"); err != nil { + return nil, err + } + page, pageSize := common.NormalizePagination(req.Page, req.PageSize) var conditions []string @@ -340,6 +354,13 @@ func (s *sAdmin) GetRequestAuditLogDetail(ctx context.Context, req *v1.RequestAu // ExportOperationLogs exports operation logs to CSV or Excel. func (s *sAdmin) ExportOperationLogs(ctx context.Context, req *v1.OperationLogExportReq) (*v1.OperationLogExportRes, error) { + if err := common.ValidateDateParam(req.StartDate, "开始日期"); err != nil { + return nil, err + } + if err := common.ValidateDateParam(req.EndDate, "结束日期"); err != nil { + return nil, err + } + buildOpLogWhere := func() (string, []any) { var conditions []string var args []any @@ -425,6 +446,13 @@ func (s *sAdmin) ExportOperationLogs(ctx context.Context, req *v1.OperationLogEx // ContentFilterLogList returns a paginated list of content filter interception logs. func (s *sAdmin) ContentFilterLogList(ctx context.Context, req *v1.ContentFilterLogListReq) (*v1.ContentFilterLogListRes, error) { + if err := common.ValidateDateParam(req.StartDate, "开始日期"); err != nil { + return nil, err + } + if err := common.ValidateDateParam(req.EndDate, "结束日期"); err != nil { + return nil, err + } + page, pageSize := common.NormalizePagination(req.Page, req.PageSize) var conditions []string diff --git a/internal/logic/admin/channel_error.go b/internal/logic/admin/channel_error.go index 65d54b2..7124146 100644 --- a/internal/logic/admin/channel_error.go +++ b/internal/logic/admin/channel_error.go @@ -9,10 +9,18 @@ import ( "github.com/gogf/gf/v2/frame/g" v1 "github.com/qianfree/team-api/api/admin/v1" + "github.com/qianfree/team-api/internal/logic/common" ) // ChannelErrorEventList 渠道错误事件列表 func (s *sAdmin) ChannelErrorEventList(ctx context.Context, req *v1.ChannelErrorEventListReq) (*v1.ChannelErrorEventListRes, error) { + if err := common.ValidateDateParam(req.StartDate, "开始日期"); err != nil { + return nil, err + } + if err := common.ValidateDateParam(req.EndDate, "结束日期"); err != nil { + return nil, err + } + var conditions []string var args []any diff --git a/internal/logic/admin/dashboard.go b/internal/logic/admin/dashboard.go index caff290..b7c422b 100644 --- a/internal/logic/admin/dashboard.go +++ b/internal/logic/admin/dashboard.go @@ -197,6 +197,13 @@ func (s *sAdmin) GetModelDistribution(ctx context.Context, req *v1.AdminDashboar // GetAllUsageLogs 获取所有租户的用量日志(管理后台) func (s *sAdmin) GetAllUsageLogs(ctx context.Context, req *v1.AdminUsageLogListReq) (*v1.AdminUsageLogListRes, error) { + if err := common.ValidateDateParam(req.StartDate, "开始日期"); err != nil { + return nil, err + } + if err := common.ValidateDateParam(req.EndDate, "结束日期"); err != nil { + return nil, err + } + page, pageSize := common.NormalizePagination(req.Page, req.PageSize) var conditions []string @@ -549,6 +556,13 @@ func (s *sAdmin) GetDashboardRecentAlerts(ctx context.Context, req *v1.AdminDash // ExportUsageLogs exports usage logs to CSV or Excel. func (s *sAdmin) ExportUsageLogs(ctx context.Context, req *v1.AdminUsageLogExportReq) (*v1.AdminUsageLogExportRes, error) { + if err := common.ValidateDateParam(req.StartDate, "开始日期"); err != nil { + return nil, err + } + if err := common.ValidateDateParam(req.EndDate, "结束日期"); err != nil { + return nil, err + } + columns := []export.Column{ {Field: "id", Header: "ID"}, {Field: "tenant_name", Header: "租户名称"}, diff --git a/internal/logic/admin/error_log.go b/internal/logic/admin/error_log.go index 73c18c7..87c675e 100644 --- a/internal/logic/admin/error_log.go +++ b/internal/logic/admin/error_log.go @@ -15,6 +15,13 @@ import ( // ErrorLogList returns a paginated list of system error logs. func (s *sAdmin) ErrorLogList(ctx context.Context, req *v1.ErrorLogListReq) (*v1.ErrorLogListRes, error) { + if err := common.ValidateDateParam(req.StartDate, "开始日期"); err != nil { + return nil, err + } + if err := common.ValidateDateParam(req.EndDate, "结束日期"); err != nil { + return nil, err + } + var conditions []string var args []any diff --git a/internal/logic/common/validation.go b/internal/logic/common/validation.go index 6b475c0..ff26459 100644 --- a/internal/logic/common/validation.go +++ b/internal/logic/common/validation.go @@ -1,6 +1,7 @@ package common import ( + "time" "unicode" "github.com/gogf/gf/v2/errors/gerror" @@ -43,3 +44,15 @@ func ValidateAdminRole(role string) error { } return nil } + +// ValidateDateParam 校验日期参数格式是否为 YYYY-MM-DD +func ValidateDateParam(date string, fieldName string) error { + if date == "" { + return nil + } + _, err := time.Parse("2006-01-02", date) + if err != nil { + return gerror.Newf("%s格式无效,应为 YYYY-MM-DD", fieldName) + } + return nil +} diff --git a/internal/logic/open/open_api.go b/internal/logic/open/open_api.go index a1507d2..a6525c6 100644 --- a/internal/logic/open/open_api.go +++ b/internal/logic/open/open_api.go @@ -10,6 +10,7 @@ import ( v1 "github.com/qianfree/team-api/api/open/v1" "github.com/qianfree/team-api/internal/dao" + "github.com/qianfree/team-api/internal/logic/common" "github.com/qianfree/team-api/internal/logic/relay" "github.com/qianfree/team-api/internal/middleware" do "github.com/qianfree/team-api/internal/model/do" @@ -417,6 +418,12 @@ func (s *sOpen) OpenKeyDelete(ctx context.Context, req *v1.OpenKeyDeleteReq) (*v // ============================================================ func (s *sOpen) OpenUsageQuery(ctx context.Context, req *v1.OpenUsageQueryReq) (*v1.OpenUsageQueryRes, error) { + if err := common.ValidateDateParam(req.StartDate, "开始日期"); err != nil { + return nil, err + } + if err := common.ValidateDateParam(req.EndDate, "结束日期"); err != nil { + return nil, err + } tenantID := middleware.GetOpenTenantID(ctx) if tenantID == 0 { return nil, fmt.Errorf("unauthorized") @@ -495,6 +502,13 @@ func (s *sOpen) OpenUsageQuery(ctx context.Context, req *v1.OpenUsageQueryReq) ( // ============================================================ func (s *sOpen) OpenBillingQuery(ctx context.Context, req *v1.OpenBillingQueryReq) (*v1.OpenBillingQueryRes, error) { + if err := common.ValidateDateParam(req.StartDate, "开始日期"); err != nil { + return nil, err + } + if err := common.ValidateDateParam(req.EndDate, "结束日期"); err != nil { + return nil, err + } + tenantID := middleware.GetOpenTenantID(ctx) if tenantID == 0 { return nil, fmt.Errorf("unauthorized") diff --git a/internal/logic/tenant/audit_config.go b/internal/logic/tenant/audit_config.go index 6cfff43..698f541 100644 --- a/internal/logic/tenant/audit_config.go +++ b/internal/logic/tenant/audit_config.go @@ -153,6 +153,13 @@ func isValidAuditLevel(level string) bool { // TenantRequestAuditLogs 分页查询租户的请求审计日志(不含 body,性能优先) func (s *sTenant) TenantRequestAuditLogs(ctx context.Context, req *v1.TenantRequestAuditLogsReq) (*v1.TenantRequestAuditLogsRes, error) { + if err := common.ValidateDateParam(req.StartDate, "开始日期"); err != nil { + return nil, err + } + if err := common.ValidateDateParam(req.EndDate, "结束日期"); err != nil { + return nil, err + } + role := middleware.GetUserRole(ctx) if role != "owner" && role != "admin" { return nil, common.NewForbiddenError("需要 owner 或 admin 权限") diff --git a/internal/logic/tenant/billing.go b/internal/logic/tenant/billing.go index d60bccd..af335e7 100644 --- a/internal/logic/tenant/billing.go +++ b/internal/logic/tenant/billing.go @@ -152,6 +152,13 @@ func (s *sTenant) WalletTransactions(ctx context.Context, req *v1.TenantWalletTr // UsageLogs 获取租户用量日志 func (s *sTenant) UsageLogs(ctx context.Context, req *v1.TenantUsageLogsReq) (*v1.TenantUsageLogsRes, error) { + if err := common.ValidateDateParam(req.StartDate, "开始日期"); err != nil { + return nil, err + } + if err := common.ValidateDateParam(req.EndDate, "结束日期"); err != nil { + return nil, err + } + tenantID := middleware.GetTenantID(ctx) userID := middleware.GetUserID(ctx) role := middleware.GetUserRole(ctx) @@ -244,6 +251,13 @@ func (s *sTenant) UsageLogs(ctx context.Context, req *v1.TenantUsageLogsReq) (*v // ExportUsageLogs exports the tenant usage logs as CSV or Excel. func (s *sTenant) ExportUsageLogs(ctx context.Context, req *v1.TenantUsageLogsExportReq) (*v1.TenantUsageLogsExportRes, error) { + if err := common.ValidateDateParam(req.StartDate, "开始日期"); err != nil { + return nil, err + } + if err := common.ValidateDateParam(req.EndDate, "结束日期"); err != nil { + return nil, err + } + tenantID := middleware.GetTenantID(ctx) userID := middleware.GetUserID(ctx) role := middleware.GetUserRole(ctx)