You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.1 KiB
53 lines
1.1 KiB
package services
|
|
|
|
import (
|
|
"context"
|
|
"git.aiterp.net/stufflog/server/internal/slerrors"
|
|
"git.aiterp.net/stufflog/server/internal/space"
|
|
"io"
|
|
"strings"
|
|
)
|
|
|
|
type Upload struct {
|
|
s3 *space.Space
|
|
}
|
|
|
|
func (upload *Upload) UploadImage(ctx context.Context, name string, contentType string, size int64, reader io.Reader) (string, error) {
|
|
if !allowedImages[contentType] {
|
|
return "", slerrors.Forbidden("Content type " + contentType + " is not allowed as an image.")
|
|
}
|
|
if !strings.HasSuffix(name, extensions[contentType]) {
|
|
name += extensions[contentType]
|
|
}
|
|
|
|
err := upload.s3.UploadFile(ctx, name, contentType, reader, size)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return upload.s3.URLFromPath(name), nil
|
|
}
|
|
|
|
func (upload *Upload) Delete(ctx context.Context, url string) error {
|
|
name, err := upload.s3.PathFromURL(url)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return upload.s3.RemoveFile(ctx, name)
|
|
}
|
|
|
|
var allowedImages = map[string]bool{
|
|
"image/jpg": true,
|
|
"image/jpeg": true,
|
|
"image/gif": true,
|
|
"image/png": true,
|
|
"image/bmp": false,
|
|
}
|
|
|
|
var extensions = map[string]string{
|
|
"image/jpg": ".jpg",
|
|
"image/jpeg": ".jpg",
|
|
"image/gif": ".gif",
|
|
"image/png": ".png",
|
|
}
|