✨ Pay for upload
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
| @@ -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), | ||||
|   | ||||
		Reference in New Issue
	
	Block a user