chore(lint): unify formatting on golangci-lint fmt (gofumpt), uncap issue reporting, fix gofumpt drift

- make format 现在与 code-check 使用同一格式化器(golangci-lint fmt),消除 goimports -local 与 gofumpt 的格式拉锯
- .golangci.yml 关闭默认 50/3 截断,完整上报所有问题(只增强不弱化)
- 全库 gofumpt 规范化(203 files, 纯格式无行为变更)
This commit is contained in:
ryan
2026-08-28 16:31:53 +08:00
parent 078ad9b2f3
commit 528240026d
204 changed files with 572 additions and 718 deletions
+1 -2
View File
@@ -4,12 +4,11 @@
package admin
import (
"Wavelet/core/contracts"
"context"
"sync"
"gorm.io/gorm"
"Wavelet/core/contracts"
)
var (
@@ -4,13 +4,12 @@
package admin
import (
"Wavelet/core/contracts"
"Wavelet/pkg/response"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"Wavelet/core/contracts"
"Wavelet/pkg/response"
)
// ListAuthSources lists all configured authentication sources.
@@ -4,6 +4,7 @@
package admin
import (
"Wavelet/pkg/response"
"context"
"net/http"
"strconv"
@@ -11,7 +12,6 @@ import (
"github.com/gin-gonic/gin"
pkgcache "Wavelet/pkg/cache/disk"
"Wavelet/pkg/response"
)
type updateCacheConfigRequest struct {
@@ -4,6 +4,9 @@
package admin
import (
"Wavelet/core/contracts"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
"context"
"encoding/json"
"errors"
@@ -15,10 +18,7 @@ import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"Wavelet/core/contracts"
"Wavelet/pkg/logger"
mail "Wavelet/pkg/mail"
"Wavelet/pkg/response"
)
const maskedConfigValue = "******"
@@ -465,7 +465,7 @@ func maskSensitiveConfig(key, value string) string {
// validateAndMergeStorageConfig parses, merges unmasked secrets, validates parameter values,
// and tests connectivity of the new storage configuration.
func validateAndMergeStorageConfig(ctx context.Context, value string, currentConfig string) (string, error) {
func validateAndMergeStorageConfig(ctx context.Context, value, currentConfig string) (string, error) {
var currentCfg contracts.StorageConfigDTO
if err := json.Unmarshal([]byte(currentConfig), &currentCfg); err != nil {
return "", fmt.Errorf("解析当前存储配置失败: %w", err)
+2 -3
View File
@@ -4,6 +4,8 @@
package admin
import (
"Wavelet/pkg/config"
"Wavelet/pkg/response"
"context"
"database/sql"
"fmt"
@@ -17,9 +19,6 @@ import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"Wavelet/pkg/config"
"Wavelet/pkg/response"
)
const (
@@ -4,6 +4,11 @@
package admin
import (
"Wavelet/core/contracts"
"Wavelet/pkg/config"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
"Wavelet/pkg/util"
"context"
"encoding/json"
"errors"
@@ -16,12 +21,6 @@ import (
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
"Wavelet/core/contracts"
"Wavelet/pkg/config"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
"Wavelet/pkg/util"
)
const (
@@ -4,6 +4,9 @@
package admin
import (
"Wavelet/pkg/config"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
"context"
"errors"
"fmt"
@@ -14,10 +17,6 @@ import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"Wavelet/pkg/config"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
)
var startTime = time.Now()
@@ -4,6 +4,9 @@
package admin
import (
"Wavelet/core/contracts"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
"fmt"
"net/http"
"strconv"
@@ -12,10 +15,6 @@ import (
"github.com/gin-gonic/gin"
"github.com/robfig/cron/v3"
"Wavelet/core/contracts"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
)
// ListTaskTypes 获取支持的任务类型列表
@@ -4,14 +4,13 @@
package admin
import (
"Wavelet/pkg/response"
"context"
"errors"
"net/http"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"Wavelet/pkg/response"
)
// CreateTemplateRequest 创建模板请求
@@ -4,6 +4,10 @@
package admin
import (
"Wavelet/pkg/buildinfo"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
"Wavelet/pkg/util"
"archive/tar"
"archive/zip"
"compress/gzip"
@@ -23,11 +27,6 @@ import (
"github.com/gin-gonic/gin"
"golang.org/x/mod/semver"
"Wavelet/pkg/buildinfo"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
"Wavelet/pkg/util"
)
const (
@@ -391,7 +390,7 @@ func matchBinaryName(name string, candidates []string) bool {
return false
}
func getCandidateBinaryNames(executable string, repository string) []string {
func getCandidateBinaryNames(executable, repository string) []string {
execName := filepath.Base(executable)
names := []string{execName}
@@ -435,7 +434,7 @@ func isLikelyBinary(name string, isDir bool, mode os.FileMode) bool {
return filepath.Ext(base) == ".exe"
}
return (mode.Perm()&0111 != 0) || (filepath.Ext(base) == "")
return (mode.Perm()&0o111 != 0) || (filepath.Ext(base) == "")
}
func findBinaryInTarGz(archivePath string, candidates []string) (string, error) {
@@ -4,6 +4,10 @@
package admin
import (
"Wavelet/core/contracts"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
"Wavelet/pkg/util"
"errors"
"net/http"
"strconv"
@@ -11,11 +15,6 @@ import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"Wavelet/core/contracts"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
"Wavelet/pkg/util"
)
// listUsersRequest 用户列表查询请求
@@ -393,7 +392,6 @@ func UpdateUser(c *gin.Context) {
IsAdmin: req.IsAdmin,
Password: req.Password,
})
if err != nil {
if abortUserLogicError(c, err, userNotFound, []string{cannotRevokeSelfAdmin}, []string{emailRequired, emailExists, passwordTooShort}) {
return
+2 -2
View File
@@ -4,13 +4,13 @@
package admin
import (
"github.com/gin-gonic/gin"
"Wavelet/core/contracts"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
"Wavelet/pkg/trace"
"Wavelet/pkg/util"
"github.com/gin-gonic/gin"
)
// LoginAdminRequired 返回管理员权限校验中间件
+3 -4
View File
@@ -5,16 +5,15 @@
package admin
import (
"Wavelet/core"
"Wavelet/core/contracts"
"Wavelet/core/extpoints"
"context"
"embed"
"reflect"
"github.com/gin-gonic/gin"
"github.com/hibiken/asynq"
"Wavelet/core"
"Wavelet/core/contracts"
"Wavelet/core/extpoints"
)
//go:embed migrations/*/*.sql
+2 -3
View File
@@ -4,14 +4,13 @@
package admin_test
import (
"Wavelet/core"
"Wavelet/plugins/domain/admin"
"context"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"Wavelet/core"
"Wavelet/plugins/domain/admin"
)
func TestAdminPluginUnit(t *testing.T) {
+5 -6
View File
@@ -4,6 +4,9 @@
package admin
import (
"Wavelet/pkg/cache/ram"
"Wavelet/pkg/idgen"
"Wavelet/pkg/util"
"context"
"encoding/json"
"errors"
@@ -14,10 +17,6 @@ import (
"github.com/shopspring/decimal"
"gorm.io/gorm"
"Wavelet/pkg/cache/ram"
"Wavelet/pkg/idgen"
"Wavelet/pkg/util"
)
const (
@@ -62,7 +61,7 @@ func PreheatSystemConfigByKey(ctx context.Context, key string) (SystemConfig, er
}
// GetSystemConfigByGroup queries a configuration by Type and Key.
func GetSystemConfigByGroup(ctx context.Context, configType string, key string) (SystemConfig, error) {
func GetSystemConfigByGroup(ctx context.Context, configType, key string) (SystemConfig, error) {
ensureSystemConfigCacheListener()
if item, ok := ram.Get(configType, key); ok {
@@ -479,7 +478,7 @@ func GetLatestTaskExecutionByTaskType(ctx context.Context, taskType string) (*Ta
}
// AppendTaskExecutionLog 将日志追加到缓冲,任务完成后再持久化到数据库。
func AppendTaskExecutionLog(ctx context.Context, taskID string, logLine string) error {
func AppendTaskExecutionLog(ctx context.Context, taskID, logLine string) error {
cacheSvc := GetCache(ctx)
if cacheSvc == nil {
return errors.New("cache service is not initialized")
+1 -2
View File
@@ -6,13 +6,12 @@
package admin
import (
"Wavelet/pkg/logger"
"context"
"fmt"
"os"
"path/filepath"
"syscall"
"Wavelet/pkg/logger"
)
const installedBinaryMode = 0o755
@@ -4,14 +4,13 @@
package admin
import (
"Wavelet/pkg/cache/ram"
"context"
"encoding/json"
"errors"
"time"
"gorm.io/gorm"
"Wavelet/pkg/cache/ram"
)
const (
@@ -57,7 +56,7 @@ func (ConfigLoader) LoadAll(ctx context.Context, configType string) ([]ram.Cache
}
// LoadOne loads a single system config from database as CacheItem.
func (ConfigLoader) LoadOne(ctx context.Context, configType string, key string) (ram.CacheItem, error) {
func (ConfigLoader) LoadOne(ctx context.Context, configType, key string) (ram.CacheItem, error) {
cfg, err := GetSystemConfigByKey(ctx, key)
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
+2 -3
View File
@@ -4,13 +4,12 @@
package auth
import (
"Wavelet/core/contracts"
"Wavelet/pkg/logger"
"context"
"encoding/json"
"github.com/gin-gonic/gin"
"Wavelet/core/contracts"
"Wavelet/pkg/logger"
)
// LogForAudit 将登录鉴权审计日志写入 Logger
@@ -4,14 +4,13 @@
package auth
import (
"Wavelet/core/contracts"
"context"
"errors"
"fmt"
"strconv"
"strings"
"Wavelet/core/contracts"
"github.com/coreos/go-oidc/v3/oidc"
"golang.org/x/oauth2"
)
@@ -128,7 +127,7 @@ func containsScope(scopes []string, scope string) bool {
return false
}
func buildOAuthUserInfo(ctx context.Context, source *AuthSource, code string, nonce string, redirectURL string) (*contracts.OAuthUserInfoDTO, error) {
func buildOAuthUserInfo(ctx context.Context, source *AuthSource, code, nonce, redirectURL string) (*contracts.OAuthUserInfoDTO, error) {
authConfig, verifier, err := buildOAuthConfig(ctx, source, redirectURL)
if err != nil {
return nil, err
+2 -3
View File
@@ -4,12 +4,11 @@
package auth
import (
"Wavelet/core/contracts"
"Wavelet/pkg/cache/ram"
"context"
"fmt"
"time"
"Wavelet/core/contracts"
"Wavelet/pkg/cache/ram"
)
const (
+3 -4
View File
@@ -4,14 +4,13 @@
package auth_test
import (
"Wavelet/core"
"Wavelet/core/contracts"
"Wavelet/plugins/domain/auth"
"context"
"encoding/json"
"testing"
"time"
"Wavelet/core"
"Wavelet/core/contracts"
"Wavelet/plugins/domain/auth"
)
type mockCacheService struct {
+5 -7
View File
@@ -4,6 +4,11 @@
package auth
import (
"Wavelet/core/contracts"
"Wavelet/pkg/idgen"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
"Wavelet/pkg/util"
"context"
"errors"
"fmt"
@@ -12,18 +17,11 @@ import (
"strings"
"time"
"Wavelet/core/contracts"
"github.com/coreos/go-oidc/v3/oidc"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"gorm.io/gorm"
"Wavelet/pkg/idgen"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
"Wavelet/pkg/util"
)
// GetLoginSources 获取可用登录源列表
+4 -5
View File
@@ -4,17 +4,16 @@
package auth
import (
"Wavelet/core/contracts"
"Wavelet/pkg/response"
"Wavelet/pkg/trace"
"Wavelet/pkg/util"
"context"
"crypto/sha256"
"encoding/hex"
"errors"
"github.com/gin-gonic/gin"
"Wavelet/core/contracts"
"Wavelet/pkg/response"
"Wavelet/pkg/trace"
"Wavelet/pkg/util"
)
func hashToken(token string) string {
+1 -2
View File
@@ -4,14 +4,13 @@
package auth
import (
"Wavelet/core/contracts"
"encoding/json"
"errors"
"regexp"
"strconv"
"strings"
"time"
"Wavelet/core/contracts"
)
var authSourceNamePattern = regexp.MustCompile(`^[A-Za-z0-9][A-Za-z0-9_-]{0,79}$`)
+3 -4
View File
@@ -5,13 +5,12 @@
package auth
import (
"context"
"embed"
"reflect"
"Wavelet/core"
"Wavelet/core/contracts"
"Wavelet/core/extpoints"
"context"
"embed"
"reflect"
)
//go:embed migrations/*/*.sql
+4 -4
View File
@@ -4,6 +4,9 @@
package auth_test
import (
"Wavelet/core"
"Wavelet/core/contracts"
"Wavelet/plugins/domain/auth"
"context"
"crypto/sha256"
"encoding/hex"
@@ -15,10 +18,6 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gorm.io/gorm"
"Wavelet/core"
"Wavelet/core/contracts"
"Wavelet/plugins/domain/auth"
)
type mockDBService struct {
@@ -84,6 +83,7 @@ func (m *mockProvider) Name() string { return "custom" }
func (m *mockProvider) GetAuthURL(state string) string {
return "https://custom.com/auth?state=" + state
}
func (m *mockProvider) ExchangeCode(ctx context.Context, code string) (*contracts.OAuthUserInfoDTO, error) {
return &contracts.OAuthUserInfoDTO{
ID: 555,
+3 -4
View File
@@ -4,13 +4,12 @@
package auth
import (
"Wavelet/core"
"Wavelet/core/contracts"
"context"
"sync"
"gorm.io/gorm"
"Wavelet/core"
"Wavelet/core/contracts"
)
var (
@@ -120,6 +119,6 @@ func ListExternalAccountsByUserID(ctx context.Context, userID uint64) ([]Externa
}
// UnbindExternalAccount 解绑外部账号
func UnbindExternalAccount(ctx context.Context, id uint64, userID uint64) error {
func UnbindExternalAccount(ctx context.Context, id, userID uint64) error {
return getDB(ctx).Where("id = ? AND user_id = ?", id, userID).Delete(&ExternalAccount{}).Error
}
+2 -3
View File
@@ -4,14 +4,13 @@
package auth
import (
"Wavelet/core/contracts"
"Wavelet/pkg/util"
"context"
"errors"
"sync"
"github.com/gin-gonic/gin"
"Wavelet/core/contracts"
"Wavelet/pkg/util"
)
type authServiceImpl struct{}
+2 -3
View File
@@ -4,6 +4,8 @@
package auth
import (
"Wavelet/core/contracts"
"Wavelet/pkg/config"
"context"
"crypto/sha256"
"encoding/hex"
@@ -15,9 +17,6 @@ import (
"github.com/gin-gonic/gin"
"github.com/google/uuid"
gsessions "github.com/gorilla/sessions"
"Wavelet/core/contracts"
"Wavelet/pkg/config"
)
// GetSessionOptions 根据配置构建 Session 选项
+3 -4
View File
@@ -4,13 +4,12 @@
package cap
import (
"net/http"
"github.com/gin-gonic/gin"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
"Wavelet/plugins/domain/cap/pow"
"net/http"
"github.com/gin-gonic/gin"
)
// ChallengeResponse is a local type alias for the pow.ChallengeResponse struct
+3 -4
View File
@@ -5,6 +5,8 @@
package cap
import (
"Wavelet/pkg/config"
"Wavelet/plugins/domain/cap/pow"
"context"
"crypto/sha256"
"encoding/hex"
@@ -12,9 +14,6 @@ import (
"strings"
"sync"
"time"
"Wavelet/pkg/config"
"Wavelet/plugins/domain/cap/pow"
)
const (
@@ -116,7 +115,7 @@ func (m *Manager) Redeem(ctx context.Context, token string, solutions []int, sco
}
// VerifyToken validates and consumes the redeem token (single-use).
func (m *Manager) VerifyToken(ctx context.Context, token string, expectedScope string) (bool, error) {
func (m *Manager) VerifyToken(ctx context.Context, token, expectedScope string) (bool, error) {
if token == "" {
return false, nil
}
+2 -2
View File
@@ -4,9 +4,9 @@
package cap
import (
"github.com/gin-gonic/gin"
"Wavelet/pkg/response"
"github.com/gin-gonic/gin"
)
// VerifyMiddleware returns a Gin middleware that checks and consumes the X-Cap-Token header.
+1 -2
View File
@@ -5,11 +5,10 @@
package cap
import (
"reflect"
"Wavelet/core"
"Wavelet/core/contracts"
"Wavelet/core/extpoints"
"reflect"
)
// Plugin implements core.Plugin to provide CAPTCHA generation, validation, and route protection.
+1 -1
View File
@@ -88,7 +88,7 @@ func RandomHex(byteLen int) string {
return hex.EncodeToString(bytes)
}
func jwtSign(payload []byte, secret []byte) string {
func jwtSign(payload, secret []byte) string {
body := b64urlEncode(payload)
sigInput := jwtHeaderB64 + "." + body
+6 -6
View File
@@ -14,12 +14,12 @@ import (
// Store defines the storage interface for challenge nonces and verification tokens
type Store interface {
Get(ctx context.Context, key string) (string, bool, error)
Set(ctx context.Context, key string, val string, ttl time.Duration) error
Set(ctx context.Context, key, val string, ttl time.Duration) error
Delete(ctx context.Context, key string) error
// SetNX atomically sets key=val with the given TTL only when the key does not
// exist yet. It returns true when the key was actually written (i.e. this
// caller "won" the race), and false when the key already existed.
SetNX(ctx context.Context, key string, val string, ttl time.Duration) (bool, error)
SetNX(ctx context.Context, key, val string, ttl time.Duration) (bool, error)
// GetAndDelete atomically retrieves the value of key and removes it in a
// single operation. Returns ("", false, nil) when the key does not exist.
GetAndDelete(ctx context.Context, key string) (string, bool, error)
@@ -68,7 +68,7 @@ func (s *MemoryStore) getLocked(key string) (string, bool, error) {
}
// Set 向 MemoryStore 写入指定 key 的值
func (s *MemoryStore) Set(_ context.Context, key string, val string, ttl time.Duration) error {
func (s *MemoryStore) Set(_ context.Context, key, val string, ttl time.Duration) error {
s.mu.Lock()
defer s.mu.Unlock()
s.items[key] = memoryItem{
@@ -88,7 +88,7 @@ func (s *MemoryStore) Delete(_ context.Context, key string) error {
// SetNX atomically sets key only when it is absent (or expired).
// Returns true if the key was written by this call.
func (s *MemoryStore) SetNX(_ context.Context, key string, val string, ttl time.Duration) (bool, error) {
func (s *MemoryStore) SetNX(_ context.Context, key, val string, ttl time.Duration) (bool, error) {
s.mu.Lock()
defer s.mu.Unlock()
@@ -159,7 +159,7 @@ func (s *RedisStore) Get(ctx context.Context, key string) (string, bool, error)
}
// Set 向 RedisStore 写入指定 key 的值
func (s *RedisStore) Set(ctx context.Context, key string, val string, ttl time.Duration) error {
func (s *RedisStore) Set(ctx context.Context, key, val string, ttl time.Duration) error {
return s.client.Set(ctx, key, val, ttl).Err()
}
@@ -169,7 +169,7 @@ func (s *RedisStore) Delete(ctx context.Context, key string) error {
}
// SetNX wraps Redis SET NX – returns true only when the key was newly created.
func (s *RedisStore) SetNX(ctx context.Context, key string, val string, ttl time.Duration) (bool, error) {
func (s *RedisStore) SetNX(ctx context.Context, key, val string, ttl time.Duration) (bool, error) {
return s.client.SetNX(ctx, key, val, ttl).Result()
}
@@ -4,6 +4,8 @@
package cap
import (
"Wavelet/core"
"Wavelet/core/contracts"
"context"
"errors"
"strconv"
@@ -13,9 +15,6 @@ import (
"golang.org/x/sync/singleflight"
"gorm.io/gorm"
"Wavelet/core"
"Wavelet/core/contracts"
)
var (
+10 -10
View File
@@ -4,6 +4,16 @@
package domain_test
import (
"Wavelet/core"
"Wavelet/core/contracts"
"Wavelet/plugins/domain/admin"
"Wavelet/plugins/domain/auth"
"Wavelet/plugins/domain/message_gateway"
"Wavelet/plugins/domain/risk_control"
"Wavelet/plugins/domain/user"
"Wavelet/plugins/infra/cache"
"Wavelet/plugins/infra/logger"
"Wavelet/plugins/infra/storage"
"context"
"io/fs"
"path/filepath"
@@ -16,17 +26,7 @@ import (
"github.com/stretchr/testify/require"
"gorm.io/gorm"
"Wavelet/core"
"Wavelet/core/contracts"
"Wavelet/plugins/domain/admin"
"Wavelet/plugins/domain/auth"
"Wavelet/plugins/domain/message_gateway"
"Wavelet/plugins/domain/risk_control"
"Wavelet/plugins/domain/user"
"Wavelet/plugins/infra/cache"
db "Wavelet/plugins/infra/database"
"Wavelet/plugins/infra/logger"
"Wavelet/plugins/infra/storage"
)
func setupTestDB(t *testing.T) *gorm.DB {
@@ -4,12 +4,11 @@
package message_gateway
import (
"Wavelet/pkg/response"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"Wavelet/pkg/response"
)
// ListAdminChannelDefinitions returns form schemas for supported channel types.
@@ -5,17 +5,15 @@
package qq
import (
"Wavelet/pkg/logger"
"Wavelet/pkg/util"
"Wavelet/plugins/domain/message_gateway"
"context"
"fmt"
"strings"
"sync"
"time"
"Wavelet/pkg/util"
"Wavelet/pkg/logger"
"Wavelet/plugins/domain/message_gateway"
"github.com/tencent-connect/botgo"
"github.com/tencent-connect/botgo/dto"
"github.com/tencent-connect/botgo/event"
@@ -4,10 +4,9 @@
package qq
import (
"Wavelet/plugins/domain/message_gateway"
"context"
"testing"
"Wavelet/plugins/domain/message_gateway"
)
func TestHandleEvent_DropsNonC2C(t *testing.T) {
@@ -5,6 +5,8 @@
package telegram
import (
"Wavelet/pkg/util"
"Wavelet/plugins/domain/message_gateway"
"context"
"fmt"
"os"
@@ -13,9 +15,6 @@ import (
"strings"
tele "gopkg.in/telebot.v4"
"Wavelet/pkg/util"
"Wavelet/plugins/domain/message_gateway"
)
// Adapter is a Telegram private-chat channel.
@@ -4,12 +4,11 @@
package telegram
import (
"Wavelet/plugins/domain/message_gateway"
"context"
"testing"
tele "gopkg.in/telebot.v4"
"Wavelet/plugins/domain/message_gateway"
)
func TestHandleUpdate_DropsGroups(t *testing.T) {
@@ -4,10 +4,9 @@
package message_gateway
import (
"Wavelet/core/contracts"
"context"
"time"
"Wavelet/core/contracts"
)
// AdminLogin is the metadata definition for the admin login event.
@@ -4,13 +4,12 @@
package message_gateway
import (
"Wavelet/core"
"Wavelet/core/contracts"
"context"
"sync"
"gorm.io/gorm"
"Wavelet/core"
"Wavelet/core/contracts"
)
var (
@@ -4,15 +4,14 @@
package message_gateway
import (
"Wavelet/core/contracts"
"Wavelet/pkg/response"
"Wavelet/pkg/util"
"errors"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"Wavelet/core/contracts"
"Wavelet/pkg/response"
"Wavelet/pkg/util"
)
func currentUser(c *gin.Context) (*contracts.UserDTO, bool) {
@@ -4,14 +4,13 @@
package message_gateway_test
import (
"Wavelet/pkg/testhelper"
"Wavelet/plugins/domain/message_gateway"
"context"
"testing"
"time"
"gorm.io/gorm"
"Wavelet/pkg/testhelper"
"Wavelet/plugins/domain/message_gateway"
)
type mockDBService struct {
@@ -5,16 +5,15 @@
package message_gateway
import (
"Wavelet/core"
"Wavelet/core/contracts"
"Wavelet/core/extpoints"
"Wavelet/pkg/util"
"context"
"embed"
"reflect"
"github.com/gin-gonic/gin"
"Wavelet/core"
"Wavelet/core/contracts"
"Wavelet/core/extpoints"
"Wavelet/pkg/util"
)
//go:embed migrations/*/*.sql
@@ -4,15 +4,14 @@
package message_gateway_test
import (
"Wavelet/core"
"Wavelet/plugins/domain/message_gateway"
"context"
"io/fs"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"Wavelet/core"
"Wavelet/plugins/domain/message_gateway"
)
func TestMessageGatewayPluginUnit(t *testing.T) {
@@ -4,6 +4,7 @@
package push
import (
"Wavelet/pkg/httppool"
"bytes"
"context"
"encoding/json"
@@ -12,8 +13,6 @@ import (
"io"
"net/http"
"strings"
"Wavelet/pkg/httppool"
)
func init() {
@@ -4,14 +4,13 @@
package push
import (
"Wavelet/pkg/util"
"context"
"errors"
"fmt"
"net"
"net/smtp"
"strings"
"Wavelet/pkg/util"
)
func init() {
@@ -4,6 +4,7 @@
package push
import (
"Wavelet/pkg/httppool"
"bytes"
"context"
"crypto/hmac"
@@ -16,8 +17,6 @@ import (
"strconv"
"strings"
"time"
"Wavelet/pkg/httppool"
)
func init() {
@@ -4,6 +4,7 @@
package push
import (
"Wavelet/pkg/httppool"
"bytes"
"context"
"encoding/json"
@@ -11,8 +12,6 @@ import (
"fmt"
"net/http"
"strings"
"Wavelet/pkg/httppool"
)
func init() {
@@ -4,6 +4,7 @@
package message_gateway
import (
"Wavelet/pkg/response"
"encoding/json"
"errors"
"net/http"
@@ -14,7 +15,6 @@ import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"Wavelet/pkg/response"
pkgpush "Wavelet/plugins/domain/message_gateway/push"
)
@@ -4,18 +4,16 @@
package message_gateway
import (
"Wavelet/pkg/logger"
"Wavelet/pkg/util"
"context"
"encoding/json"
"errors"
"sync"
"Wavelet/pkg/logger"
pkgpush "Wavelet/plugins/domain/message_gateway/push"
"gorm.io/gorm"
"Wavelet/pkg/util"
)
// NotificationMessage represents the structured notification message payload.
@@ -122,7 +120,7 @@ func (t *EventTrigger) Trigger(ctx context.Context, meta EventMetadata, body map
})
}
func (t *EventTrigger) buildMessage(event *PushEvent, meta EventMetadata, flatBody map[string]any, body map[string]any) (NotificationMessage, string) {
func (t *EventTrigger) buildMessage(event *PushEvent, meta EventMetadata, flatBody, body map[string]any) (NotificationMessage, string) {
var msg NotificationMessage
renderedTemplate := ""
@@ -4,6 +4,7 @@
package message_gateway
import (
"Wavelet/pkg/response"
"errors"
"fmt"
"net/http"
@@ -13,8 +14,6 @@ import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"Wavelet/pkg/response"
)
// UpdatePushEventRequest is the request body for updating a push event.
@@ -4,6 +4,7 @@
package message_gateway
import (
"Wavelet/core/contracts"
"context"
"encoding/json"
"errors"
@@ -13,7 +14,6 @@ import (
"gorm.io/gorm"
"Wavelet/core/contracts"
pkgpush "Wavelet/plugins/domain/message_gateway/push"
)
@@ -368,7 +368,7 @@ func resolveDynamicKeyword(target string, flatBody map[string]any) string {
return target
}
func resolveTargetUser(ctx context.Context, resolved string, _ string) (contracts.UserDTO, bool) {
func resolveTargetUser(ctx context.Context, resolved, _ string) (contracts.UserDTO, bool) {
var user contracts.UserDTO
if id, err := strconv.ParseUint(resolved, 10, 64); err == nil {
if err := getDB(ctx).Table("w_users").Where("id = ?", id).First(&user).Error; err == nil {
@@ -381,7 +381,7 @@ func resolveTargetUser(ctx context.Context, resolved string, _ string) (contract
return user, false
}
func resolveSystemTarget(ctx context.Context, resolved string, channel string) (string, bool) {
func resolveSystemTarget(ctx context.Context, resolved, channel string) (string, bool) {
if resolved != "系统" && resolved != "system" && resolved != "0" {
return "", false
}
@@ -507,7 +507,7 @@ func getFlatBody(body map[string]any) map[string]any {
return flatResult
}
func flattenMap(prefix string, m map[string]any, result map[string]any) {
func flattenMap(prefix string, m, result map[string]any) {
for k, v := range m {
key := k
if prefix != "" {
@@ -4,13 +4,12 @@
package message_gateway
import (
"Wavelet/core/contracts"
"Wavelet/pkg/logger"
"context"
"encoding/json"
"strconv"
"time"
"Wavelet/core/contracts"
"Wavelet/pkg/logger"
)
func handleTaskCompleted(ctx context.Context, e contracts.TaskCompletedEvent) {
@@ -59,7 +58,7 @@ func handleTaskCompleted(ctx context.Context, e contracts.TaskCompletedEvent) {
}
}
func extractUserFromMap(ctx context.Context, data map[string]any, body map[string]any) {
func extractUserFromMap(ctx context.Context, data, body map[string]any) {
if u, exists := body["user"]; exists && u != nil {
return
}
@@ -4,14 +4,13 @@
package message_gateway
import (
"Wavelet/core/contracts"
"Wavelet/pkg/logger"
"Wavelet/plugins/domain/message_gateway/push"
"context"
"encoding/json"
"errors"
"fmt"
"Wavelet/core/contracts"
"Wavelet/pkg/logger"
"Wavelet/plugins/domain/message_gateway/push"
)
const (
@@ -101,7 +100,7 @@ func (h *PushHandler) Execute(ctx context.Context, payload []byte) error {
return nil
}
func (h *PushHandler) recordHistory(ctx context.Context, req SendPayload, status string, errMsg string) {
func (h *PushHandler) recordHistory(ctx context.Context, req SendPayload, status, errMsg string) {
if dbErr := recordPushHistory(ctx, req, status, errMsg); dbErr != nil {
logger.ErrorF(ctx, "[Push] 写入推送历史审计记录失败: %v", dbErr)
}
@@ -4,13 +4,12 @@
package message_gateway
import (
"Wavelet/pkg/idgen"
"context"
"errors"
"time"
"gorm.io/gorm"
"Wavelet/pkg/idgen"
)
const (
@@ -4,10 +4,9 @@
package message_gateway
import (
"Wavelet/pkg/logger"
"context"
"sync"
"Wavelet/pkg/logger"
)
// Runner manages lifecycle for long-lived channel adapters (WebSocket, long-polling, etc.).
@@ -4,12 +4,11 @@
package message_gateway
import (
"Wavelet/pkg/config"
"Wavelet/pkg/util"
"crypto/sha256"
"encoding/hex"
"encoding/json"
"Wavelet/pkg/config"
"Wavelet/pkg/util"
)
// CredentialKey is AES-256 hex derived from the session secret.
@@ -4,13 +4,12 @@
package risk_control
import (
"context"
"sync"
"time"
"Wavelet/pkg/batchwriter"
"Wavelet/pkg/logger"
"Wavelet/plugins/domain/risk_control/logstore"
"context"
"sync"
"time"
)
var (
@@ -5,13 +5,12 @@
package logstore
import (
"Wavelet/pkg/util"
"context"
"fmt"
"time"
"gorm.io/gorm"
"Wavelet/pkg/util"
)
// CountAccessLogs returns the number of access logs matching filter.
@@ -169,9 +169,9 @@ func (m *mockConn) Exec(_ context.Context, _ string, _ ...any) error { return ni
func (m *mockConn) AsyncInsert(_ context.Context, _ string, _ bool, _ ...any) error { return nil }
func (m *mockConn) InsertFormat(_ context.Context, _ string, _ string, _ io.Reader) error { return nil }
func (m *mockConn) InsertFormat(_ context.Context, _, _ string, _ io.Reader) error { return nil }
func (m *mockConn) QueryFormat(_ context.Context, _ string, _ string, _ ...any) (io.ReadCloser, error) {
func (m *mockConn) QueryFormat(_ context.Context, _, _ string, _ ...any) (io.ReadCloser, error) {
return nil, nil
}
@@ -4,13 +4,12 @@
package logstore
import (
"Wavelet/pkg/logger"
"context"
"errors"
"fmt"
"strconv"
"time"
"Wavelet/pkg/logger"
)
const (
@@ -4,14 +4,13 @@
package logstore
import (
"Wavelet/core"
"Wavelet/core/contracts"
"context"
"sync"
"github.com/ClickHouse/clickhouse-go/v2/lib/driver"
"gorm.io/gorm"
"Wavelet/core"
"Wavelet/core/contracts"
)
var (
@@ -4,6 +4,7 @@
package logstore
import (
"Wavelet/pkg/idgen"
"context"
"errors"
"fmt"
@@ -12,8 +13,6 @@ import (
"time"
"gorm.io/gorm"
"Wavelet/pkg/idgen"
)
const (
@@ -4,14 +4,13 @@
package logstore
import (
"Wavelet/pkg/config"
"Wavelet/pkg/logger"
"context"
"errors"
"fmt"
"sync"
"time"
"Wavelet/pkg/config"
"Wavelet/pkg/logger"
)
const (
@@ -5,18 +5,17 @@
package risk_control
import (
"encoding/json"
"net/http"
"time"
"github.com/gin-gonic/gin"
"Wavelet/core/contracts"
"Wavelet/pkg/config"
"Wavelet/pkg/idgen"
"Wavelet/pkg/response"
"Wavelet/pkg/util"
"Wavelet/plugins/domain/risk_control/logstore"
"encoding/json"
"net/http"
"time"
"github.com/gin-gonic/gin"
)
// Middleware is an alias for RiskControlMiddleware.
@@ -4,6 +4,13 @@
package risk_control_test
import (
"Wavelet/core/contracts"
"Wavelet/pkg/batchwriter"
"Wavelet/pkg/config"
"Wavelet/pkg/testhelper"
"Wavelet/pkg/util"
"Wavelet/plugins/domain/risk_control"
"Wavelet/plugins/domain/risk_control/logstore"
"context"
"encoding/json"
"net/http"
@@ -14,14 +21,6 @@ import (
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
"Wavelet/core/contracts"
"Wavelet/pkg/batchwriter"
"Wavelet/pkg/config"
"Wavelet/pkg/testhelper"
"Wavelet/pkg/util"
"Wavelet/plugins/domain/risk_control"
"Wavelet/plugins/domain/risk_control/logstore"
)
func newTestAccessLogWriter(t *testing.T, cfg batchwriter.Config) (*batchwriter.Writer[*logstore.UserAccessLog], func() []*logstore.UserAccessLog) {
@@ -5,16 +5,15 @@
package risk_control
import (
"Wavelet/core"
"Wavelet/core/contracts"
"Wavelet/core/extpoints"
"Wavelet/plugins/domain/risk_control/logstore"
"context"
"embed"
"reflect"
"github.com/gin-gonic/gin"
"Wavelet/core"
"Wavelet/core/contracts"
"Wavelet/core/extpoints"
"Wavelet/plugins/domain/risk_control/logstore"
)
//go:embed logstore/migrations/*/*.sql
@@ -4,15 +4,14 @@
package risk_control_test
import (
"Wavelet/core"
"Wavelet/plugins/domain/risk_control"
"context"
"testing"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"Wavelet/core"
"Wavelet/plugins/domain/risk_control"
)
func TestRiskControlPluginUnit(t *testing.T) {
+4 -5
View File
@@ -5,15 +5,14 @@
package system
import (
"net/http"
"reflect"
"github.com/gin-gonic/gin"
"Wavelet/core"
"Wavelet/core/contracts"
"Wavelet/pkg/config"
"Wavelet/pkg/response"
"net/http"
"reflect"
"github.com/gin-gonic/gin"
)
// Plugin implements core.Plugin to provide system-level basic routes.
+1 -1
View File
@@ -5,13 +5,13 @@
package cache
import (
"Wavelet/plugins/domain/upload/shared"
"context"
"encoding/json"
"strings"
"sync"
"time"
"Wavelet/plugins/domain/upload/shared"
uploadstorage "Wavelet/plugins/domain/upload/storage"
)
+1 -1
View File
@@ -4,11 +4,11 @@
package cache
import (
"Wavelet/plugins/domain/upload/shared"
"context"
"testing"
"time"
"Wavelet/plugins/domain/upload/shared"
uploadstorage "Wavelet/plugins/domain/upload/storage"
)
+4 -7
View File
@@ -4,15 +4,14 @@
package cache
import (
"Wavelet/pkg/cache/ram"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
"context"
"fmt"
"time"
"gorm.io/gorm"
"Wavelet/pkg/cache/ram"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
)
const (
@@ -21,9 +20,7 @@ const (
uploadMetaInvalidationChan = "upload:meta_invalidation"
)
var (
uploadMetaRAM = ram.MustNew[uint64, models.Upload](ram.Options{MaximumSize: uploadMetaRAMMaximumSize})
)
var uploadMetaRAM = ram.MustNew[uint64, models.Upload](ram.Options{MaximumSize: uploadMetaRAMMaximumSize})
func uploadMetaRedisKey(id uint64) string {
return fmt.Sprintf("upload:meta:%d", id)
+3 -4
View File
@@ -4,14 +4,13 @@
package cache
import (
"Wavelet/pkg/testhelper"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
"context"
"testing"
"gorm.io/gorm"
"Wavelet/pkg/testhelper"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
)
func init() {
@@ -5,6 +5,13 @@
package filesrv
import (
"Wavelet/core/contracts"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
"Wavelet/plugins/domain/upload/cache"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
"Wavelet/plugins/domain/upload/util"
"bytes"
"context"
"errors"
@@ -15,16 +22,11 @@ import (
"strings"
"sync"
"Wavelet/core/contracts"
pkgcache "Wavelet/pkg/cache/disk"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
pkgutil "Wavelet/pkg/util"
"Wavelet/plugins/domain/upload/cache"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
uploadstorage "Wavelet/plugins/domain/upload/storage"
"Wavelet/plugins/domain/upload/util"
"github.com/gin-gonic/gin"
"golang.org/x/sync/singleflight"
@@ -4,6 +4,12 @@
package filesrv
import (
"Wavelet/core/contracts"
"Wavelet/pkg/response"
"Wavelet/pkg/testhelper"
"Wavelet/plugins/domain/upload/cache"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
"bytes"
"context"
"crypto/sha256"
@@ -23,12 +29,6 @@ import (
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin"
"Wavelet/core/contracts"
"Wavelet/pkg/response"
"Wavelet/pkg/testhelper"
"Wavelet/plugins/domain/upload/cache"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
uploadutil "Wavelet/plugins/domain/upload/util"
)
@@ -45,7 +45,7 @@ func (s *localTestStorageService) Put(_ context.Context, key string, body io.Rea
s.mu.Lock()
defer s.mu.Unlock()
path := filepath.Join(s.root, key)
_ = os.MkdirAll(filepath.Dir(path), 0755)
_ = os.MkdirAll(filepath.Dir(path), 0o755)
f, err := os.Create(path)
if err != nil {
return contracts.StoragePutResult{}, err
@@ -140,10 +140,10 @@ func TestServeFileByIDAccessControl(t *testing.T) {
AccessMode: 1,
}
if err := os.WriteFile(filepath.Join(tempDir, "avatar.png"), []byte("image"), 0644); err != nil {
if err := os.WriteFile(filepath.Join(tempDir, "avatar.png"), []byte("image"), 0o644); err != nil {
t.Fatalf("failed to write avatar file: %v", err)
}
if err := os.WriteFile(filepath.Join(tempDir, "doc.pdf"), []byte("bytes"), 0644); err != nil {
if err := os.WriteFile(filepath.Join(tempDir, "doc.pdf"), []byte("bytes"), 0o644); err != nil {
t.Fatalf("failed to write attachment file: %v", err)
}
@@ -235,7 +235,7 @@ func TestServeFileByIDImageCompression(t *testing.T) {
}
filePath := filepath.Join(tempDir, "test_image.png")
if err := os.WriteFile(filePath, pngBuf.Bytes(), 0644); err != nil {
if err := os.WriteFile(filePath, pngBuf.Bytes(), 0o644); err != nil {
t.Fatalf("failed to write test png: %v", err)
}
@@ -4,11 +4,6 @@
package handler
import (
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"Wavelet/core/contracts"
"Wavelet/pkg/response"
"Wavelet/pkg/util"
@@ -16,6 +11,11 @@ import (
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/repository"
"Wavelet/plugins/domain/upload/shared"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
uploadstorage "Wavelet/plugins/domain/upload/storage"
)
@@ -4,16 +4,15 @@
package handler
import (
"Wavelet/core/contracts"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"github.com/gin-gonic/gin"
"Wavelet/core/contracts"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
)
func TestGetDistinctUploadTypes(t *testing.T) {
@@ -4,15 +4,14 @@
package handler
import (
"Wavelet/plugins/domain/upload/ingest"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/repository"
"context"
"errors"
"sort"
"gorm.io/gorm"
"Wavelet/plugins/domain/upload/ingest"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/repository"
)
func listUploadFiles(ctx context.Context, filter repository.UploadListFilter) (int64, []models.Upload, error) {
@@ -5,6 +5,14 @@
package handler
import (
"Wavelet/core/contracts"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
"Wavelet/plugins/domain/upload/filesrv"
"Wavelet/plugins/domain/upload/ingest"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
"Wavelet/plugins/domain/upload/util"
"archive/zip"
"bufio"
"bytes"
@@ -24,16 +32,9 @@ import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"Wavelet/core/contracts"
"Wavelet/pkg/logger"
"Wavelet/pkg/response"
pkgutil "Wavelet/pkg/util"
"Wavelet/plugins/domain/upload/filesrv"
"Wavelet/plugins/domain/upload/ingest"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
uploadstorage "Wavelet/plugins/domain/upload/storage"
"Wavelet/plugins/domain/upload/util"
)
type batchDownloadRequest struct {
@@ -4,6 +4,11 @@
package handler
import (
"Wavelet/core/contracts"
"Wavelet/pkg/response"
"Wavelet/pkg/util"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
"archive/zip"
"bytes"
"context"
@@ -22,11 +27,6 @@ import (
"github.com/gin-gonic/gin"
"Wavelet/core/contracts"
"Wavelet/pkg/response"
"Wavelet/pkg/util"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
uploadstats "Wavelet/plugins/domain/upload/stats"
)
@@ -112,8 +112,8 @@ func (s *handlerTestStorage) Put(_ context.Context, key string, body io.Reader,
*s.putCount++
}
if strings.HasPrefix(key, "uploads/") {
_ = os.MkdirAll(filepath.Dir(key), 0755)
_ = os.WriteFile(key, data, 0644)
_ = os.MkdirAll(filepath.Dir(key), 0o755)
_ = os.WriteFile(key, data, 0o644)
}
return contracts.StoragePutResult{Key: key, Bucket: "test-bucket"}, nil
}
@@ -367,11 +367,11 @@ func TestDownloadFile(t *testing.T) {
}
// Create local file
err := os.MkdirAll("uploads", 0755)
err := os.MkdirAll("uploads", 0o755)
if err != nil {
t.Fatalf("failed to create directory: %v", err)
}
err = os.WriteFile(localUpload.FilePath, []byte("hello download"), 0644)
err = os.WriteFile(localUpload.FilePath, []byte("hello download"), 0o644)
if err != nil {
t.Fatalf("failed to write file: %v", err)
}
@@ -563,14 +563,14 @@ func TestBatchDownloadFiles(t *testing.T) {
router := setupTestRouter(authUser)
// Create and write files locally
err := os.MkdirAll("uploads", 0755)
err := os.MkdirAll("uploads", 0o755)
if err != nil {
t.Fatalf("failed to create local dir: %v", err)
}
_ = os.WriteFile("uploads/f1.txt", []byte("file1 content"), 0644)
_ = os.WriteFile("uploads/f2.txt", []byte("file2 content"), 0644)
_ = os.WriteFile("uploads/f3.txt", []byte("duplicate name file content"), 0644)
_ = os.WriteFile("uploads/f1.txt", []byte("file1 content"), 0o644)
_ = os.WriteFile("uploads/f2.txt", []byte("file2 content"), 0o644)
_ = os.WriteFile("uploads/f3.txt", []byte("duplicate name file content"), 0o644)
// Seed upload records. Note f2 and f3 have the same FileName "file_a.txt" to trigger name collision resolution.
uploads := []models.Upload{
@@ -4,13 +4,12 @@
package handler
import (
"Wavelet/pkg/response"
"Wavelet/plugins/domain/upload/shared"
"net/http"
"time"
"github.com/gin-gonic/gin"
"Wavelet/pkg/response"
"Wavelet/plugins/domain/upload/shared"
)
type trendItem struct {
@@ -4,9 +4,8 @@
package ingest
import (
"errors"
"Wavelet/plugins/domain/upload/shared"
"errors"
)
// ErrForbidden indicates the caller is not allowed to mutate the upload record.
@@ -4,6 +4,11 @@
package ingest
import (
"Wavelet/pkg/idgen"
"Wavelet/pkg/logger"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/repository"
"Wavelet/plugins/domain/upload/shared"
"context"
"encoding/json"
"errors"
@@ -14,12 +19,8 @@ import (
"gorm.io/gorm"
"Wavelet/pkg/idgen"
"Wavelet/pkg/logger"
uploadcache "Wavelet/plugins/domain/upload/cache"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/repository"
"Wavelet/plugins/domain/upload/shared"
uploadstats "Wavelet/plugins/domain/upload/stats"
uploadstorage "Wavelet/plugins/domain/upload/storage"
)
@@ -4,13 +4,12 @@
package ingest
import (
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/repository"
"context"
"errors"
"gorm.io/gorm"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/repository"
)
// Ingest stores or resolves an upload using the configured policy and side effects.
@@ -4,6 +4,9 @@
package ingest
import (
"Wavelet/core/contracts"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
"bytes"
"context"
"crypto/sha256"
@@ -12,10 +15,6 @@ import (
"os"
"sync"
"testing"
"Wavelet/core/contracts"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
)
type testStorageService struct {
@@ -64,7 +63,7 @@ func (s *testStorageService) Ingest(_ context.Context, _ io.Reader, _ contracts.
return nil, nil
}
func setupMockStorage(t *testing.T, putCount *int) (restore func(), disable func()) {
func setupMockStorage(t *testing.T, putCount *int) (restore, disable func()) {
t.Helper()
mockSvc := &testStorageService{
mockFiles: make(map[string][]byte),
@@ -4,14 +4,15 @@
package ingest
import (
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/repository"
"Wavelet/plugins/domain/upload/shared"
"context"
"gorm.io/gorm"
uploadcache "Wavelet/plugins/domain/upload/cache"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/repository"
"Wavelet/plugins/domain/upload/shared"
uploadstats "Wavelet/plugins/domain/upload/stats"
)
@@ -5,9 +5,8 @@
package ingest
import (
"io"
"Wavelet/plugins/domain/upload/models"
"io"
)
// Policy controls how ingest handles hash collisions and record creation.
+6 -7
View File
@@ -5,13 +5,6 @@
package upload
import (
"context"
"embed"
"reflect"
"github.com/gin-gonic/gin"
"github.com/hibiken/asynq"
"Wavelet/core"
"Wavelet/core/contracts"
"Wavelet/core/extpoints"
@@ -19,6 +12,12 @@ import (
"Wavelet/plugins/domain/upload/handler"
"Wavelet/plugins/domain/upload/shared"
"Wavelet/plugins/domain/upload/task"
"context"
"embed"
"reflect"
"github.com/gin-gonic/gin"
"github.com/hibiken/asynq"
)
//go:embed migrations/*/*.sql
+3 -4
View File
@@ -4,14 +4,13 @@
package upload
import (
"Wavelet/pkg/idgen"
"Wavelet/pkg/util"
"Wavelet/plugins/domain/upload/shared"
"context"
"strings"
"gorm.io/gorm"
"Wavelet/pkg/idgen"
"Wavelet/pkg/util"
"Wavelet/plugins/domain/upload/shared"
)
// UploadListFilter filters paginated upload queries.
@@ -5,14 +5,13 @@
package repository
import (
"Wavelet/pkg/util"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
"context"
"strings"
"gorm.io/gorm"
"Wavelet/pkg/util"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
)
// UploadListFilter filters paginated upload queries.
@@ -7,8 +7,8 @@ package shared
const (
MaxUploadSize = 32 * 1024 * 1024 // 32MB
DetectContentBytes = 512 // http.DetectContentType 需要的最小字节数
UploadDirPerm = 0755 // 上传目录权限
UploadFilePerm = 0644 // 上传文件权限
UploadDirPerm = 0o755 // 上传目录权限
UploadFilePerm = 0o644 // 上传文件权限
ImageQualityLow = "low"
ImageQualityMedium = "medium"
ImageQualityHigh = "high"
@@ -4,13 +4,12 @@
package shared
import (
"Wavelet/core"
"Wavelet/core/contracts"
"context"
"sync"
"gorm.io/gorm"
"Wavelet/core"
"Wavelet/core/contracts"
)
var (
@@ -4,6 +4,8 @@
package shared
import (
"Wavelet/core/contracts"
"Wavelet/pkg/testhelper"
"bytes"
"context"
"crypto/sha256"
@@ -20,9 +22,6 @@ import (
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"Wavelet/core/contracts"
"Wavelet/pkg/testhelper"
)
// MockDBService is a mock implementation of contracts.DBService for unit testing.
@@ -130,8 +129,8 @@ func (m *MockStorageService) Put(_ context.Context, key string, body io.Reader,
}
m.objects[key] = data
if strings.HasPrefix(key, "uploads/") {
_ = os.MkdirAll(filepath.Dir(key), 0755)
_ = os.WriteFile(key, data, 0644)
_ = os.MkdirAll(filepath.Dir(key), 0o755)
_ = os.WriteFile(key, data, 0o644)
}
return contracts.StoragePutResult{Key: key, Bucket: "test-bucket"}, nil
}
@@ -234,7 +233,7 @@ func (a *MockAuthService) VerifyToken(_ context.Context, token string) (*contrac
}
// Authenticate verifies credentials.
func (a *MockAuthService) Authenticate(_ context.Context, _ string, _ string) (*contracts.UserDTO, error) {
func (a *MockAuthService) Authenticate(_ context.Context, _, _ string) (*contracts.UserDTO, error) {
return nil, nil
}
@@ -5,9 +5,8 @@
package stats
import (
"strings"
"Wavelet/plugins/domain/upload/util"
"strings"
)
const (
@@ -4,15 +4,14 @@
package stats
import (
"Wavelet/pkg/logger"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
"context"
"time"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"Wavelet/pkg/logger"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
)
// ApplyUploadStatsAdd increments incremental stats for a newly active upload record.
@@ -4,15 +4,14 @@
package stats
import (
"Wavelet/pkg/testhelper"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
"context"
"testing"
"time"
"gorm.io/gorm"
"Wavelet/pkg/testhelper"
"Wavelet/plugins/domain/upload/models"
"Wavelet/plugins/domain/upload/shared"
)
type mockDBService struct {

Some files were not shown because too many files have changed in this diff Show More