♻️ Migrated to nexus
This commit is contained in:
@ -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),
|
||||
|
@ -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
|
||||
}
|
@ -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...")
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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"`
|
||||
|
@ -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"`
|
||||
|
@ -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"`
|
||||
|
@ -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"`
|
||||
|
@ -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 {
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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")
|
||||
|
@ -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...")
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -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,
|
||||
|
44
pkg/main.go
44
pkg/main.go
@ -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()
|
||||
}
|
||||
|
Reference in New Issue
Block a user