migrate from github

This commit is contained in:
2026-07-15 22:42:31 +08:00
commit 3ad559f05e
262 changed files with 21637 additions and 0 deletions
+39
View File
@@ -0,0 +1,39 @@
package media
import (
"strings"
)
const (
MaxAvatarSize = 5 * 1024 * 1024
defaultAvatarExtension = ".jpg"
)
var avatarContentTypes = map[string]string{
"image/jpeg": ".jpg",
"image/png": ".png",
"image/webp": ".webp",
}
func NormalizeAvatarContentType(file []byte, provided string) string {
return NormalizeContentTypeByAllowed(file, provided, avatarContentTypes)
}
func IsSupportedAvatarContentType(contentType string) bool {
return IsContentTypeAllowed(contentType, avatarContentTypes)
}
func ResolveAvatarExt(filename, contentType string) string {
return ResolveExtension(filename, contentType, avatarContentTypes, defaultAvatarExtension)
}
func BuildAvatarObjectKey(userExternalID string, avatarVersion int64, ext string) string {
return BuildVersionedObjectKey("avatars", userExternalID, avatarVersion, ext)
}
func BuildAvatarURL(userExternalID, objectKey string, avatarVersion int64) string {
if strings.TrimSpace(userExternalID) == "" || strings.TrimSpace(objectKey) == "" {
return ""
}
return BuildStorageURL(objectKey)
}
+84
View File
@@ -0,0 +1,84 @@
package media
import (
"fmt"
"mime"
"net/http"
"path/filepath"
"strings"
"github.com/XingfenD/yoresee_doc/pkg/storage"
)
func normalizeMIMEType(contentType string) string {
normalized := strings.ToLower(strings.TrimSpace(contentType))
if idx := strings.Index(normalized, ";"); idx > 0 {
normalized = strings.TrimSpace(normalized[:idx])
}
if normalized == "image/jpg" {
return "image/jpeg"
}
return normalized
}
func NormalizeContentTypeByAllowed(file []byte, provided string, allowed map[string]string) string {
normalized := normalizeMIMEType(provided)
if _, ok := allowed[normalized]; ok {
return normalized
}
detected := normalizeMIMEType(http.DetectContentType(file))
if _, ok := allowed[detected]; ok {
return detected
}
return ""
}
func IsContentTypeAllowed(contentType string, allowed map[string]string) bool {
_, ok := allowed[normalizeMIMEType(contentType)]
return ok
}
func ResolveExtension(filename, contentType string, allowed map[string]string, defaultExt string) string {
ext := strings.TrimSpace(strings.ToLower(filepath.Ext(filename)))
if ext != "" {
for _, candidate := range allowed {
if ext == candidate {
return ext
}
}
}
contentType = normalizeMIMEType(contentType)
if mapped, ok := allowed[contentType]; ok {
return mapped
}
exts, err := mime.ExtensionsByType(contentType)
if err == nil && len(exts) > 0 {
for _, candidate := range exts {
candidate = strings.TrimSpace(strings.ToLower(candidate))
for _, allowedExt := range allowed {
if candidate == allowedExt {
return candidate
}
}
}
}
return strings.TrimSpace(strings.ToLower(defaultExt))
}
func BuildVersionedObjectKey(prefix, ownerExternalID string, version int64, ext string) string {
prefix = strings.Trim(strings.TrimSpace(prefix), "/")
if prefix == "" {
return fmt.Sprintf("%s/v%d%s", ownerExternalID, version, ext)
}
return fmt.Sprintf("%s/%s/v%d%s", prefix, ownerExternalID, version, ext)
}
func BuildStorageURL(objectKey string) string {
if strings.TrimSpace(objectKey) == "" {
return ""
}
return storage.BuildPublicObjectPath(objectKey)
}