Pay for upload

This commit is contained in:
2025-01-29 19:12:54 +08:00
parent 96f429e1d9
commit 80739eab52
5 changed files with 100 additions and 24 deletions

View File

@ -32,8 +32,8 @@ func createAttachmentDirectly(c *fiber.Ctx) error {
return err
}
if !user.HasPermNode("CreateAttachments", file.Size) {
return fiber.NewError(fiber.StatusForbidden, "you are not permitted to create attachments like this large")
if !user.HasPermNode("CreateAttachments", true) {
return fiber.NewError(fiber.StatusForbidden, "you are not permitted to create attachments")
} 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))
}
@ -62,6 +62,13 @@ func createAttachmentDirectly(c *fiber.Ctx) error {
return fiber.NewError(fiber.StatusBadRequest, err.Error())
}
// If pool has no belongs to, it means it is shared pool, apply shared attachment discount
withDiscount := pool.AccountID == nil
if err := services.PlaceOrder(user.ID, file.Size, withDiscount); err != nil {
tx.Rollback()
return fiber.NewError(fiber.StatusPaymentRequired, err.Error())
}
tx.Commit()
metadata.Pool = &pool

View File

@ -41,13 +41,15 @@ func createAttachmentFragment(c *fiber.Ctx) error {
return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("unable to get attachment pool info: %v", err))
}
if !user.HasPermNode("CreateAttachments", data.Size) {
return fiber.NewError(fiber.StatusForbidden, "you are not permitted to create attachments like this large")
if !user.HasPermNode("CreateAttachments", true) {
return fiber.NewError(fiber.StatusForbidden, "you are not permitted to create attachments")
} 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))
}
metadata, err := services.NewAttachmentFragment(database.C, user, models.AttachmentFragment{
tx := database.C.Begin()
metadata, err := services.NewAttachmentFragment(tx, user, models.AttachmentFragment{
Name: data.FileName,
Size: data.Size,
Alternative: data.Alternative,
@ -63,6 +65,15 @@ func createAttachmentFragment(c *fiber.Ctx) error {
metadata.FileChunksMissing = services.FindFragmentMissingChunks(metadata)
}
// If pool has no belongs to, it means it is shared pool, apply shared attachment discount
withDiscount := pool.AccountID == nil
if err := services.PlaceOrder(user.ID, data.Size, withDiscount); err != nil {
tx.Rollback()
return fiber.NewError(fiber.StatusPaymentRequired, err.Error())
}
tx.Commit()
return c.JSON(fiber.Map{
"chunk_size": viper.GetInt64("performance.file_chunk_size"),
"chunk_count": len(metadata.FileChunks),