♻️ Migrated to nexus

This commit is contained in:
2024-10-27 13:13:40 +08:00
parent 07417deea9
commit 2e32de4716
25 changed files with 348 additions and 378 deletions

View File

@ -1,13 +1,14 @@
package database
import (
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/gap"
"git.solsynth.dev/hypernet/nexus/pkg/nex/cruda"
"github.com/rs/zerolog/log"
"github.com/samber/lo"
"github.com/spf13/viper"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
)
var C *gorm.DB
@ -15,10 +16,8 @@ var C *gorm.DB
func NewSource() error {
var err error
dialector := postgres.Open(viper.GetString("database.dsn"))
C, err = gorm.Open(dialector, &gorm.Config{NamingStrategy: schema.NamingStrategy{
TablePrefix: viper.GetString("database.prefix"),
}, Logger: logger.New(&log.Logger, logger.Config{
dsn, err := cruda.NewCrudaConn(gap.Nx).AllocDatabase("paperclip")
C, err = gorm.Open(postgres.Open(dsn), &gorm.Config{Logger: logger.New(&log.Logger, logger.Config{
Colorful: true,
IgnoreRecordNotFoundError: true,
LogLevel: lo.Ternary(viper.GetBool("debug.database"), logger.Info, logger.Silent),

View File

@ -1,15 +0,0 @@
package gap
import "net"
func GetOutboundIP() (net.IP, error) {
conn, err := net.Dial("udp", "1.1.1.1:80")
if err != nil {
return nil, err
} else {
defer conn.Close()
}
localAddr := conn.LocalAddr().(*net.UDPAddr)
return localAddr.IP, nil
}

View File

@ -2,36 +2,37 @@ package gap
import (
"fmt"
"git.solsynth.dev/hydrogen/dealer/pkg/hyper"
"git.solsynth.dev/hydrogen/dealer/pkg/proto"
"git.solsynth.dev/hypernet/nexus/pkg/nex"
"git.solsynth.dev/hypernet/nexus/pkg/proto"
"github.com/rs/zerolog/log"
"github.com/samber/lo"
"strings"
"github.com/spf13/viper"
)
var H *hyper.HyperConn
var Nx *nex.Conn
func RegisterService() error {
func InitializeToNexus() error {
grpcBind := strings.SplitN(viper.GetString("grpc_bind"), ":", 2)
httpBind := strings.SplitN(viper.GetString("bind"), ":", 2)
outboundIp, _ := GetOutboundIP()
outboundIp, _ := nex.GetOutboundIP()
grpcOutbound := fmt.Sprintf("%s:%s", outboundIp, grpcBind[1])
httpOutbound := fmt.Sprintf("%s:%s", outboundIp, httpBind[1])
var err error
H, err = hyper.NewHyperConn(viper.GetString("dealer.addr"), &proto.ServiceInfo{
Nx, err = nex.NewNexusConn(viper.GetString("nexus_addr"), &proto.ServiceInfo{
Id: viper.GetString("id"),
Type: hyper.ServiceTypeFileProvider,
Type: "uc",
Label: "Paperclip",
GrpcAddr: grpcOutbound,
HttpAddr: &httpOutbound,
HttpAddr: lo.ToPtr("http://" + httpOutbound),
})
if err == nil {
go func() {
err := H.KeepRegisterService()
err := Nx.RunRegistering()
if err != nil {
log.Error().Err(err).Msg("An error occurred while registering service...")
}

View File

@ -3,7 +3,7 @@ package grpc
import (
"net"
"git.solsynth.dev/hydrogen/dealer/pkg/proto"
"git.solsynth.dev/hypernet/nexus/pkg/proto"
"github.com/spf13/viper"
"google.golang.org/grpc"
health "google.golang.org/grpc/health/grpc_health_v1"
@ -11,25 +11,30 @@ import (
)
type Server struct {
proto.UnimplementedServiceDirectoryServer
proto.UnimplementedDirectoryServiceServer
health.UnimplementedHealthServer
srv *grpc.Server
}
var S *grpc.Server
func NewGrpc() *Server {
server := &Server{
srv: grpc.NewServer(),
}
func NewGRPC() {
S = grpc.NewServer()
proto.RegisterDirectoryServiceServer(server.srv, server)
health.RegisterHealthServer(server.srv, server)
health.RegisterHealthServer(S, &Server{})
proto.RegisterServiceDirectoryServer(S, &Server{})
reflection.Register(server.srv)
reflection.Register(S)
return server
}
func ListenGRPC() error {
func (v *Server) Listen() error {
listener, err := net.Listen("tcp", viper.GetString("grpc_bind"))
if err != nil {
return err
}
return S.Serve(listener)
return v.srv.Serve(listener)
}

View File

@ -2,28 +2,46 @@ package grpc
import (
"context"
"git.solsynth.dev/hypernet/nexus/pkg/nex"
"strconv"
"git.solsynth.dev/hydrogen/dealer/pkg/proto"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/database"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/models"
"git.solsynth.dev/hypernet/nexus/pkg/proto"
)
func (v *Server) BroadcastDeletion(ctx context.Context, request *proto.DeletionRequest) (*proto.DeletionResponse, error) {
switch request.GetResourceType() {
case "account":
numericId, err := strconv.Atoi(request.GetResourceId())
if err != nil {
func (v *Server) BroadcastEvent(ctx context.Context, in *proto.EventInfo) (*proto.EventResponse, error) {
switch in.GetEvent() {
case "deletion":
data := nex.DecodeMap(in.GetData())
resType, ok := data["type"].(string)
if !ok {
break
}
for _, model := range database.AutoMaintainRange {
switch model.(type) {
default:
database.C.Delete(model, "account_id = ?", numericId)
switch resType {
case "account":
id, ok := data["id"].(string)
if !ok {
break
}
numericId, err := strconv.Atoi(id)
if err != nil {
break
}
tx := database.C.Begin()
for _, model := range database.AutoMaintainRange {
switch model.(type) {
default:
tx.Delete(model, "account_id = ?", numericId)
}
}
if tx.Delete(&models.Account{}, "id = ?", numericId).Error != nil {
tx.Rollback()
break
}
tx.Commit()
}
database.C.Delete(&models.Account{}, "id = ?", numericId)
}
return &proto.DeletionResponse{}, nil
return &proto.EventResponse{}, nil
}

View File

@ -1,9 +1,9 @@
package models
import "git.solsynth.dev/hydrogen/dealer/pkg/hyper"
import "git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
type Account struct {
hyper.BaseUser
sec.UserInfo
Attachments []Attachment `json:"attachments"`
Pools []AttachmentPool `json:"pools"`

View File

@ -1,9 +1,9 @@
package models
import (
"git.solsynth.dev/hypernet/nexus/pkg/nex/cruda"
"time"
"git.solsynth.dev/hydrogen/dealer/pkg/hyper"
"gorm.io/datatypes"
)
@ -15,7 +15,7 @@ const (
)
type Attachment struct {
hyper.BaseModel
cruda.BaseModel
// Random ID is for accessing (appear in URL)
Rid string `json:"rid" gorm:"uniqueIndex"`

View File

@ -1,12 +1,12 @@
package models
import (
"git.solsynth.dev/hydrogen/dealer/pkg/hyper"
"git.solsynth.dev/hypernet/nexus/pkg/nex/cruda"
"gorm.io/datatypes"
)
type AttachmentPool struct {
hyper.BaseModel
cruda.BaseModel
Alias string `json:"alias"`
Name string `json:"name"`

View File

@ -1,9 +1,11 @@
package models
import "git.solsynth.dev/hydrogen/dealer/pkg/hyper"
import (
"git.solsynth.dev/hypernet/nexus/pkg/nex/cruda"
)
type Sticker struct {
hyper.BaseModel
cruda.BaseModel
Alias string `json:"alias"`
Name string `json:"name"`
@ -16,7 +18,7 @@ type Sticker struct {
}
type StickerPack struct {
hyper.BaseModel
cruda.BaseModel
Prefix string `json:"prefix"`
Name string `json:"name"`

View File

@ -3,8 +3,8 @@ package api
import (
"fmt"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/database"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/gap"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/server/exts"
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"net/url"
"path/filepath"
@ -82,11 +82,7 @@ func getAttachmentMeta(c *fiber.Ctx) error {
func updateAttachmentMeta(c *fiber.Ctx) error {
id, _ := c.ParamsInt("id", 0)
if err := gap.H.EnsureAuthenticated(c); err != nil {
return err
}
user := c.Locals("user").(models.Account)
user := c.Locals("nex_user").(sec.UserInfo)
var data struct {
Alternative string `json:"alt"`
@ -116,11 +112,7 @@ func updateAttachmentMeta(c *fiber.Ctx) error {
func deleteAttachment(c *fiber.Ctx) error {
id, _ := c.ParamsInt("id", 0)
if err := gap.H.EnsureAuthenticated(c); err != nil {
return err
}
user := c.Locals("user").(models.Account)
user := c.Locals("nex_user").(sec.UserInfo)
attachment, err := services.GetAttachmentByID(uint(id))
if err != nil {

View File

@ -1,6 +1,9 @@
package api
import "github.com/gofiber/fiber/v2"
import (
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"github.com/gofiber/fiber/v2"
)
func MapAPIs(app *fiber.App, baseURL string) {
app.Get("/.well-known/destinations", getDestinations)
@ -9,32 +12,32 @@ func MapAPIs(app *fiber.App, baseURL string) {
{
api.Get("/pools", listPost)
api.Get("/pools/:id", getPool)
api.Post("/pools", createPool)
api.Put("/pools/:id", updatePool)
api.Delete("/pools/:id", deletePool)
api.Post("/pools", sec.ValidatorMiddleware, createPool)
api.Put("/pools/:id", sec.ValidatorMiddleware, updatePool)
api.Delete("/pools/:id", sec.ValidatorMiddleware, deletePool)
api.Get("/attachments", listAttachment)
api.Get("/attachments/:id/meta", getAttachmentMeta)
api.Get("/attachments/:id", openAttachment)
api.Post("/attachments", createAttachmentDirectly)
api.Put("/attachments/:id", updateAttachmentMeta)
api.Delete("/attachments/:id", deleteAttachment)
api.Post("/attachments", sec.ValidatorMiddleware, createAttachmentDirectly)
api.Put("/attachments/:id", sec.ValidatorMiddleware, updateAttachmentMeta)
api.Delete("/attachments/:id", sec.ValidatorMiddleware, deleteAttachment)
api.Post("/attachments/multipart", createAttachmentMultipartPlaceholder)
api.Post("/attachments/multipart/:file/:chunk", uploadAttachmentMultipart)
api.Post("/attachments/multipart", sec.ValidatorMiddleware, createAttachmentMultipartPlaceholder)
api.Post("/attachments/multipart/:file/:chunk", sec.ValidatorMiddleware, uploadAttachmentMultipart)
api.Get("/stickers/lookup", lookupStickerBatch)
api.Get("/stickers/lookup/:alias", lookupSticker)
api.Get("/stickers/packs", listStickerPacks)
api.Get("/stickers/packs/:packId", getStickerPack)
api.Post("/stickers/packs", createStickerPack)
api.Put("/stickers/packs/:packId", updateStickerPack)
api.Delete("/stickers/packs/:packId", deleteStickerPack)
api.Post("/stickers/packs", sec.ValidatorMiddleware, createStickerPack)
api.Put("/stickers/packs/:packId", sec.ValidatorMiddleware, updateStickerPack)
api.Delete("/stickers/packs/:packId", sec.ValidatorMiddleware, deleteStickerPack)
api.Get("/stickers", listStickers)
api.Get("/stickers/:stickerId", getSticker)
api.Post("/stickers", createSticker)
api.Put("/stickers/:stickerId", updateSticker)
api.Delete("/stickers/:stickerId", deleteSticker)
api.Post("/stickers", sec.ValidatorMiddleware, createSticker)
api.Put("/stickers/:stickerId", sec.ValidatorMiddleware, updateSticker)
api.Delete("/stickers/:stickerId", sec.ValidatorMiddleware, deleteSticker)
}
}

View File

@ -1,10 +1,10 @@
package api
import (
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/gap"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/models"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/server/exts"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/services"
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"github.com/gofiber/fiber/v2"
"gorm.io/datatypes"
)
@ -27,10 +27,7 @@ func getPool(c *fiber.Ctx) error {
}
func createPool(c *fiber.Ctx) error {
if err := gap.H.EnsureGrantedPerm(c, "CreateAttachmentPools", true); err != nil {
return err
}
user := c.Locals("user").(models.Account)
user := c.Locals("nex_user").(sec.UserInfo)
var data struct {
Alias string `json:"alias" validate:"required"`
@ -59,10 +56,7 @@ func createPool(c *fiber.Ctx) error {
}
func updatePool(c *fiber.Ctx) error {
if err := gap.H.EnsureAuthenticated(c); err != nil {
return err
}
user := c.Locals("user").(models.Account)
user := c.Locals("nex_user").(sec.UserInfo)
var data struct {
Alias string `json:"alias" validate:"required"`
@ -94,10 +88,7 @@ func updatePool(c *fiber.Ctx) error {
}
func deletePool(c *fiber.Ctx) error {
if err := gap.H.EnsureAuthenticated(c); err != nil {
return err
}
user := c.Locals("user").(models.Account)
user := c.Locals("nex_user").(sec.UserInfo)
id, _ := c.ParamsInt("id")
pool, err := services.GetAttachmentPoolWithUser(uint(id), user.ID)

View File

@ -2,10 +2,10 @@ package api
import (
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/database"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/gap"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/models"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/server/exts"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/services"
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"github.com/gofiber/fiber/v2"
)
@ -55,10 +55,7 @@ func getStickerPack(c *fiber.Ctx) error {
}
func createStickerPack(c *fiber.Ctx) error {
if err := gap.H.EnsureAuthenticated(c); err != nil {
return err
}
user := c.Locals("user").(models.Account)
user := c.Locals("nex_user").(sec.UserInfo)
var data struct {
Prefix string `json:"prefix" validate:"required,alphanum,min=2,max=12"`
@ -79,10 +76,7 @@ func createStickerPack(c *fiber.Ctx) error {
}
func updateStickerPack(c *fiber.Ctx) error {
if err := gap.H.EnsureAuthenticated(c); err != nil {
return err
}
user := c.Locals("user").(models.Account)
user := c.Locals("nex_user").(sec.UserInfo)
var data struct {
Prefix string `json:"prefix" validate:"required,alphanum,min=2,max=12"`
@ -112,10 +106,7 @@ func updateStickerPack(c *fiber.Ctx) error {
}
func deleteStickerPack(c *fiber.Ctx) error {
if err := gap.H.EnsureAuthenticated(c); err != nil {
return err
}
user := c.Locals("user").(models.Account)
user := c.Locals("nex_user").(sec.UserInfo)
id, _ := c.ParamsInt("packId", 0)
pack, err := services.GetStickerPackWithUser(uint(id), user.ID)

View File

@ -2,10 +2,10 @@ package api
import (
"fmt"
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"strings"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/database"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/gap"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/models"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/server/exts"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/services"
@ -80,10 +80,7 @@ func getSticker(c *fiber.Ctx) error {
}
func createSticker(c *fiber.Ctx) error {
if err := gap.H.EnsureAuthenticated(c); err != nil {
return err
}
user := c.Locals("user").(models.Account)
user := c.Locals("nex_user").(sec.UserInfo)
var data struct {
Alias string `json:"alias" validate:"required,alphanum,min=2,max=12"`
@ -128,10 +125,7 @@ func createSticker(c *fiber.Ctx) error {
}
func updateSticker(c *fiber.Ctx) error {
if err := gap.H.EnsureAuthenticated(c); err != nil {
return err
}
user := c.Locals("user").(models.Account)
user := c.Locals("nex_user").(sec.UserInfo)
var data struct {
Alias string `json:"alias" validate:"required,alphanum,min=2,max=12"`
@ -179,10 +173,7 @@ func updateSticker(c *fiber.Ctx) error {
}
func deleteSticker(c *fiber.Ctx) error {
if err := gap.H.EnsureAuthenticated(c); err != nil {
return err
}
user := c.Locals("user").(models.Account)
user := c.Locals("nex_user").(sec.UserInfo)
id, _ := c.ParamsInt("stickerId", 0)
sticker, err := services.GetStickerWithUser(uint(id), user.ID)

View File

@ -3,19 +3,16 @@ package api
import (
"fmt"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/database"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/gap"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/models"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/services"
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"github.com/gofiber/fiber/v2"
jsoniter "github.com/json-iterator/go"
"github.com/spf13/viper"
)
func createAttachmentDirectly(c *fiber.Ctx) error {
if err := gap.H.EnsureAuthenticated(c); err != nil {
return err
}
user := c.Locals("user").(models.Account)
user := c.Locals("nex_user").(sec.UserInfo)
poolAlias := c.FormValue("pool")
@ -34,8 +31,8 @@ func createAttachmentDirectly(c *fiber.Ctx) error {
return err
}
if err = gap.H.EnsureGrantedPerm(c, "CreateAttachments", file.Size); err != nil {
return err
if !user.HasPermNode("CreateAttachments", file.Size) {
return fiber.NewError(fiber.StatusForbidden, "you are not permitted to create attachments like this large")
} else if pool.Config.Data().MaxFileSize != nil && file.Size > *pool.Config.Data().MaxFileSize {
return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("attachment pool %s doesn't allow file larger than %d", pool.Alias, *pool.Config.Data().MaxFileSize))
}
@ -68,7 +65,7 @@ func createAttachmentDirectly(c *fiber.Ctx) error {
tx.Commit()
metadata.Account = user
metadata.Account = models.Account{UserInfo: user}
metadata.Pool = &pool
services.PublishAnalyzeTask(metadata)

View File

@ -4,19 +4,16 @@ import (
"encoding/json"
"fmt"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/database"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/gap"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/models"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/server/exts"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/services"
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"github.com/gofiber/fiber/v2"
"github.com/spf13/viper"
)
func createAttachmentMultipartPlaceholder(c *fiber.Ctx) error {
if err := gap.H.EnsureAuthenticated(c); err != nil {
return err
}
user := c.Locals("user").(models.Account)
user := c.Locals("nex_user").(sec.UserInfo)
var data struct {
Pool string `json:"pool" validate:"required"`
@ -42,8 +39,8 @@ func createAttachmentMultipartPlaceholder(c *fiber.Ctx) error {
return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("unable to get attachment pool info: %v", err))
}
if err = gap.H.EnsureGrantedPerm(c, "CreateAttachments", data.Size); err != nil {
return err
if !user.HasPermNode("CreateAttachments", data.Size) {
return fiber.NewError(fiber.StatusForbidden, "you are not permitted to create attachments like this large")
} else if pool.Config.Data().MaxFileSize != nil && *pool.Config.Data().MaxFileSize > data.Size {
return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("attachment pool %s doesn't allow file larger than %d", pool.Alias, *pool.Config.Data().MaxFileSize))
}
@ -72,10 +69,7 @@ func createAttachmentMultipartPlaceholder(c *fiber.Ctx) error {
}
func uploadAttachmentMultipart(c *fiber.Ctx) error {
if err := gap.H.EnsureAuthenticated(c); err != nil {
return err
}
user := c.Locals("user").(models.Account)
user := c.Locals("nex_user").(sec.UserInfo)
rid := c.Params("file")
cid := c.Params("chunk")

View File

@ -1,12 +1,9 @@
package server
import (
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"strings"
"git.solsynth.dev/hydrogen/dealer/pkg/hyper"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/database"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/gap"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/models"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/server/api"
"github.com/gofiber/fiber/v2"
@ -18,10 +15,14 @@ import (
"github.com/spf13/viper"
)
var app *fiber.App
var IReader *sec.InternalTokenReader
func NewServer() {
app = fiber.New(fiber.Config{
type App struct {
app *fiber.App
}
func NewServer() *App {
app := fiber.New(fiber.Config{
DisableStartupMessage: true,
EnableIPValidation: true,
ServerHeader: "Hydrogen.Paperclip",
@ -55,23 +56,15 @@ func NewServer() {
Output: log.Logger,
}))
tablePrefix := viper.GetString("database.prefix")
app.Use(gap.H.AuthMiddleware)
app.Use(hyper.LinkAccountMiddleware(
database.C,
tablePrefix+"accounts",
func(u hyper.BaseUser) models.Account {
return models.Account{
BaseUser: u,
}
},
))
app.Use(sec.ContextMiddleware(IReader))
api.MapAPIs(app, "/api")
return &App{app}
}
func Listen() {
if err := app.Listen(viper.GetString("bind")); err != nil {
func (v *App) Listen() {
if err := v.app.Listen(viper.GetString("bind")); err != nil {
log.Fatal().Err(err).Msg("An error occurred when starting server...")
}
}

View File

@ -3,6 +3,7 @@ package services
import (
"context"
"fmt"
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"math"
"mime"
"mime/multipart"
@ -16,7 +17,6 @@ import (
"github.com/spf13/viper"
"gorm.io/datatypes"
"git.solsynth.dev/hydrogen/dealer/pkg/hyper"
localCache "git.solsynth.dev/hydrogen/paperclip/pkg/internal/cache"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/database"
@ -32,7 +32,7 @@ func GetAttachmentCacheKey(rid string) any {
func GetAttachmentByID(id uint) (models.Attachment, error) {
var attachment models.Attachment
if err := database.C.
Where(&hyper.BaseModel{ID: id}).
Where("id = ?", id).
Preload("Pool").Preload("Account").
First(&attachment).Error; err != nil {
return attachment, err
@ -102,7 +102,7 @@ func CacheAttachment(item models.Attachment) {
marshal := marshaler.New(cacheManager)
contx := context.Background()
marshal.Set(
_ = marshal.Set(
contx,
GetAttachmentCacheKey(item.Rid),
item,
@ -111,7 +111,7 @@ func CacheAttachment(item models.Attachment) {
)
}
func NewAttachmentMetadata(tx *gorm.DB, user models.Account, file *multipart.FileHeader, attachment models.Attachment) (models.Attachment, error) {
func NewAttachmentMetadata(tx *gorm.DB, user sec.UserInfo, file *multipart.FileHeader, attachment models.Attachment) (models.Attachment, error) {
attachment.Uuid = uuid.NewString()
attachment.Rid = RandString(16)
attachment.Size = file.Size
@ -150,7 +150,7 @@ func NewAttachmentMetadata(tx *gorm.DB, user models.Account, file *multipart.Fil
return attachment, nil
}
func NewAttachmentPlaceholder(tx *gorm.DB, user models.Account, attachment models.Attachment) (models.Attachment, error) {
func NewAttachmentPlaceholder(tx *gorm.DB, user sec.UserInfo, attachment models.Attachment) (models.Attachment, error) {
attachment.Uuid = uuid.NewString()
attachment.Rid = RandString(16)
attachment.IsUploaded = false
@ -234,9 +234,7 @@ func DeleteAttachment(item models.Attachment) error {
if item.RefID != nil {
var refTarget models.Attachment
if err := database.C.Where(models.Attachment{
BaseModel: hyper.BaseModel{ID: *item.RefID},
}).First(&refTarget).Error; err == nil {
if err := database.C.Where("id = ?", *item.RefID).First(&refTarget).Error; err == nil {
refTarget.RefCount--
if err := tx.Save(&refTarget).Error; err != nil {
tx.Rollback()
@ -251,7 +249,7 @@ func DeleteAttachment(item models.Attachment) error {
cacheManager := cache.New[any](localCache.S)
marshal := marshaler.New(cacheManager)
contx := context.Background()
marshal.Delete(contx, GetAttachmentCacheKey(item.Rid))
_ = marshal.Delete(contx, GetAttachmentCacheKey(item.Rid))
}
tx.Commit()

View File

@ -3,6 +3,7 @@ package services
import (
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/database"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/models"
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"gorm.io/gorm"
)
@ -30,7 +31,7 @@ func ListStickerPackWithStickers(tx *gorm.DB, take, offset int) ([]models.Sticke
return packs, nil
}
func NewStickerPack(user models.Account, prefix, name, desc string) (models.StickerPack, error) {
func NewStickerPack(user sec.UserInfo, prefix, name, desc string) (models.StickerPack, error) {
pack := models.StickerPack{
Prefix: prefix,
Name: name,

View File

@ -1,20 +1,23 @@
package main
import (
"fmt"
pkg "git.solsynth.dev/hydrogen/paperclip/pkg/internal"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/gap"
"git.solsynth.dev/hypernet/nexus/pkg/nex/sec"
"github.com/fatih/color"
"os"
"os/signal"
"syscall"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/cache"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/database"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/gap"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/grpc"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/server"
"git.solsynth.dev/hydrogen/paperclip/pkg/internal/services"
"github.com/robfig/cron/v3"
pkg "git.solsynth.dev/hydrogen/paperclip/pkg/internal"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"github.com/spf13/viper"
@ -26,6 +29,12 @@ func init() {
}
func main() {
// Booting screen
fmt.Println(color.YellowString(" ____ _ _\n| _ \\ __ _ _ __ ___ _ __ ___| (_)_ __\n| |_) / _` | '_ \\ / _ \\ '__/ __| | | '_ \\\n| __/ (_| | |_) | __/ | | (__| | | |_) |\n|_| \\__,_| .__/ \\___|_| \\___|_|_| .__/\n |_| |_|"))
fmt.Printf("%s v%s\n", color.New(color.FgHiYellow).Add(color.Bold).Sprintf("Hypernet.Paperclip"), pkg.AppVersion)
fmt.Printf("The upload service in Hypernet\n")
color.HiBlack("=====================================================\n")
// Configure settings
viper.AddConfigPath(".")
viper.AddConfigPath("..")
@ -37,6 +46,19 @@ func main() {
log.Panic().Err(err).Msg("An error occurred when loading settings.")
}
// Connect to nexus
if err := gap.InitializeToNexus(); err != nil {
log.Error().Err(err).Msg("An error occurred when registering service to nexus...")
}
// Load keypair
if reader, err := sec.NewInternalTokenReader(viper.GetString("security.internal_public_key")); err != nil {
log.Error().Err(err).Msg("An error occurred when reading internal public key for jwt. Authentication related features will be disabled.")
} else {
server.IReader = reader
log.Info().Msg("Internal jwt public key loaded.")
}
// Connect to database
if err := database.NewSource(); err != nil {
log.Fatal().Err(err).Msg("An error occurred when connect to database.")
@ -49,11 +71,6 @@ func main() {
log.Fatal().Err(err).Msg("An error occurred when initializing cache.")
}
// Connect other services
if err := gap.RegisterService(); err != nil {
log.Error().Err(err).Msg("An error occurred when registering service to dealer...")
}
// Set up some workers
for idx := 0; idx < viper.GetInt("workers.files_deletion"); idx++ {
go services.StartConsumeDeletionTask()
@ -71,24 +88,19 @@ func main() {
quartz.Start()
// Server
server.NewServer()
go server.Listen()
go server.NewServer().Listen()
// Grpc Server
grpc.NewGRPC()
go grpc.ListenGRPC()
// Messages
log.Info().Msgf("Paperclip v%s is started...", pkg.AppVersion)
go grpc.NewGrpc().Listen()
// Post-boot actions
services.ScanUnanalyzedFileFromDatabase()
services.RunMarkLifecycleDeletionTask()
// Messages
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Info().Msgf("Paperclip v%s is quitting...", pkg.AppVersion)
quartz.Stop()
}