Referenced external attachment

This commit is contained in:
LittleSheep 2025-04-05 11:51:35 +08:00
parent 048535d1c0
commit 1de0a86074
18 changed files with 90 additions and 15 deletions

View File

@ -14,7 +14,8 @@ import (
) )
const ( const (
AttachmentDstTemporary = 0 // The destination 0 is a reserved config for pre-upload processing AttachmentDstExternal = -1 // The destination marked the file did not store inside our service
AttachmentDstTemporary = 0 // Destination 0 is a reserved config for pre-upload processing
) )
const ( const (

View File

@ -6,8 +6,8 @@ import (
"os" "os"
"path/filepath" "path/filepath"
pkg "git.solsynth.dev/hypernet/paperclip/pkg/internal"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models" "git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
pkg "git.solsynth.dev/hypernet/paperclip/pkg/internal"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
"github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7"
"github.com/spf13/viper" "github.com/spf13/viper"

View File

@ -2,8 +2,8 @@ package api
import ( import (
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec" "git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models" "git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/server/exts" "git.solsynth.dev/hypernet/paperclip/pkg/internal/server/exts"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/services" "git.solsynth.dev/hypernet/paperclip/pkg/internal/services"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"

View File

@ -37,6 +37,7 @@ func MapAPIs(app *fiber.App, baseURL string) {
attachments.Get("/:id/meta", getAttachmentMeta) attachments.Get("/:id/meta", getAttachmentMeta)
attachments.Get("/:id", openAttachment) attachments.Get("/:id", openAttachment)
attachments.Post("/", sec.ValidatorMiddleware, createAttachmentDirectly) attachments.Post("/", sec.ValidatorMiddleware, createAttachmentDirectly)
attachments.Post("/referenced", sec.ValidatorMiddleware, createAttachmentWithURL)
attachments.Put("/:id", sec.ValidatorMiddleware, updateAttachmentMeta) attachments.Put("/:id", sec.ValidatorMiddleware, updateAttachmentMeta)
attachments.Delete("/:id", sec.ValidatorMiddleware, deleteAttachment) attachments.Delete("/:id", sec.ValidatorMiddleware, deleteAttachment)
} }

View File

@ -2,9 +2,9 @@ package api
import ( import (
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec" "git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database" "git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/gap" "git.solsynth.dev/hypernet/paperclip/pkg/internal/gap"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/server/exts" "git.solsynth.dev/hypernet/paperclip/pkg/internal/server/exts"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/services" "git.solsynth.dev/hypernet/paperclip/pkg/internal/services"
"git.solsynth.dev/hypernet/passport/pkg/authkit" "git.solsynth.dev/hypernet/passport/pkg/authkit"

View File

@ -2,10 +2,11 @@ package api
import ( import (
"fmt" "fmt"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/server/exts"
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec" "git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models" "git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/services" "git.solsynth.dev/hypernet/paperclip/pkg/internal/services"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
@ -81,3 +82,50 @@ func createAttachmentDirectly(c *fiber.Ctx) error {
return c.JSON(metadata) return c.JSON(metadata)
} }
func createAttachmentWithURL(c *fiber.Ctx) error {
user := c.Locals("nex_user").(*sec.UserInfo)
poolAlias := c.FormValue("pool")
aliasingMap := viper.GetStringMapString("pools.aliases")
if val, ok := aliasingMap[poolAlias]; ok {
poolAlias = val
}
var data struct {
URL string `json:"url"`
Metadata map[string]any `json:"metadata"`
Mimetype string `json:"mimetype"`
Name string `json:"filename"`
Alternative string `json:"alt"`
}
if err := exts.BindAndValidate(c, &data); err != nil {
return err
}
if !user.HasPermNode("CreateReferencedAttachments", true) {
return fiber.NewError(fiber.StatusForbidden, "you are not permitted to create attachments with URL")
}
pool, err := services.GetAttachmentPoolByAlias(poolAlias)
if err != nil {
return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("unable to get attachment pool info: %v", err))
}
attachment := models.Attachment{
Name: data.Name,
Alternative: data.Alternative,
MimeType: c.FormValue("mimetype"),
Usermeta: data.Metadata,
IsAnalyzed: true,
Destination: models.AttachmentDstExternal,
Pool: &pool,
PoolID: &pool.ID,
}
if attachment, err = services.NewRefURLAttachment(database.C, user, attachment); err != nil {
return fiber.NewError(fiber.StatusBadRequest, err.Error())
}
return c.JSON(attachment)
}

View File

@ -5,9 +5,9 @@ import (
"fmt" "fmt"
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec" "git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database" "git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/fs" "git.solsynth.dev/hypernet/paperclip/pkg/internal/fs"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/server/exts" "git.solsynth.dev/hypernet/paperclip/pkg/internal/server/exts"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/services" "git.solsynth.dev/hypernet/paperclip/pkg/internal/services"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"

View File

@ -158,6 +158,25 @@ func NewAttachmentMetadata(tx *gorm.DB, user *sec.UserInfo, file *multipart.File
return attachment, nil return attachment, nil
} }
func NewRefURLAttachment(tx *gorm.DB, user *sec.UserInfo, attachment models.Attachment) (models.Attachment, error) {
if attachment.RefURL == nil {
return attachment, fmt.Errorf("attachment doesn't have a ref url")
}
attachment.Uuid = uuid.NewString()
attachment.Rid = RandString(16)
attachment.Size = 0
attachment.Destination = models.AttachmentDstExternal
attachment.Type = models.AttachmentTypeNormal
attachment.AccountID = user.ID
if err := tx.Save(&attachment).Error; err != nil {
return attachment, fmt.Errorf("failed to save attachment record: %v", err)
}
return attachment, nil
}
func TryLinkAttachment(tx *gorm.DB, og models.Attachment, hash string) (bool, error) { func TryLinkAttachment(tx *gorm.DB, og models.Attachment, hash string) (bool, error) {
prev, err := GetAttachmentByHash(hash) prev, err := GetAttachmentByHash(hash)
if err != nil { if err != nil {

View File

@ -5,9 +5,9 @@ import (
"fmt" "fmt"
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec" "git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database" "git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/fs" "git.solsynth.dev/hypernet/paperclip/pkg/internal/fs"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"github.com/spf13/cast" "github.com/spf13/cast"

View File

@ -3,8 +3,8 @@ package services
import ( import (
"time" "time"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models" "git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
) )

View File

@ -12,9 +12,9 @@ import (
"git.solsynth.dev/hypernet/nexus/pkg/nex/cachekit" "git.solsynth.dev/hypernet/nexus/pkg/nex/cachekit"
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec" "git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database" "git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/gap" "git.solsynth.dev/hypernet/paperclip/pkg/internal/gap"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"github.com/google/uuid" "github.com/google/uuid"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"

View File

@ -66,6 +66,12 @@ func OpenAttachmentByRID(rid string, preferredSize int, region ...string) (url s
mimetype = result.Attachment.MimeType mimetype = result.Attachment.MimeType
} }
if result.Attachment.RefURL != nil {
url = *result.Attachment.RefURL
filesize = 0
return
}
filesize = result.Attachment.Size filesize = result.Attachment.Size
var dest models.BaseDestination var dest models.BaseDestination

View File

@ -5,8 +5,8 @@ import (
"fmt" "fmt"
"time" "time"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models" "git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/gap" "git.solsynth.dev/hypernet/paperclip/pkg/internal/gap"
wproto "git.solsynth.dev/hypernet/wallet/pkg/proto" wproto "git.solsynth.dev/hypernet/wallet/pkg/proto"

View File

@ -1,8 +1,8 @@
package services package services
import ( import (
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models" "git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
) )
func ListAttachmentPool() ([]models.AttachmentPool, error) { func ListAttachmentPool() ([]models.AttachmentPool, error) {

View File

@ -4,8 +4,8 @@ import (
"fmt" "fmt"
"strings" "strings"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models" "git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
) )
func SetAttachmentAsThumbnail(item models.Attachment) (models.Attachment, error) { func SetAttachmentAsThumbnail(item models.Attachment) (models.Attachment, error) {

View File

@ -2,8 +2,8 @@ package services
import ( import (
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec" "git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models" "git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@ -6,8 +6,8 @@ import (
"gorm.io/gorm" "gorm.io/gorm"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models" "git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"github.com/spf13/viper" "github.com/spf13/viper"
) )

View File

@ -8,9 +8,9 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database" "git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
"git.solsynth.dev/hypernet/paperclip/pkg/internal/fs" "git.solsynth.dev/hypernet/paperclip/pkg/internal/fs"
"git.solsynth.dev/hypernet/paperclip/pkg/filekit/models"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
"github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7"