Compare commits
No commits in common. "c2304f6a7dafe8ed73734545f187ff92d062a26e" and "2feda33e26e2ee77692f65ae84b6b08f91ea2b33" have entirely different histories.
c2304f6a7d
...
2feda33e26
8 changed files with 30 additions and 36 deletions
19
Dockerfile
19
Dockerfile
|
|
@ -1,5 +1,14 @@
|
||||||
FROM golang:1.25.1-alpine3.22 AS builder
|
FROM golang:1.25.1-alpine3.22 AS builder
|
||||||
|
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
bash \
|
||||||
|
curl \
|
||||||
|
git \
|
||||||
|
ca-certificates
|
||||||
|
|
||||||
|
|
||||||
|
RUN apk add --no-cache tzdata
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY go.mod go.sum ./
|
COPY go.mod go.sum ./
|
||||||
RUN go mod download
|
RUN go mod download
|
||||||
|
|
@ -7,11 +16,19 @@ COPY . .
|
||||||
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -ldflags="-s -w" -o main "./cmd"
|
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -ldflags="-s -w" -o main "./cmd"
|
||||||
|
|
||||||
|
|
||||||
FROM ubuntu:24.04
|
FROM alpine:3.22
|
||||||
|
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
bash \
|
||||||
|
curl \
|
||||||
|
ca-certificates \
|
||||||
|
tzdata
|
||||||
|
|
||||||
COPY --from=builder /app/main /usr/local/bin/app
|
COPY --from=builder /app/main /usr/local/bin/app
|
||||||
|
|
||||||
|
|
||||||
RUN chmod +x /usr/local/bin/app
|
RUN chmod +x /usr/local/bin/app
|
||||||
|
#RUN adduser -D -s /bin/bash appuser
|
||||||
|
#USER appuser
|
||||||
|
|
||||||
ENTRYPOINT ["app"]
|
ENTRYPOINT ["app"]
|
||||||
1
api.env
1
api.env
|
|
@ -12,7 +12,6 @@ MEDIA_STORAGE_USER=
|
||||||
MEDIA_STORAGE_PASS=
|
MEDIA_STORAGE_PASS=
|
||||||
MEDIA_STORAGE_HOST=
|
MEDIA_STORAGE_HOST=
|
||||||
MEDIA_STORAGE_PORT=
|
MEDIA_STORAGE_PORT=
|
||||||
MEDIA_STORAGE_SECURE=false
|
|
||||||
|
|
||||||
DB_HOST=
|
DB_HOST=
|
||||||
DB_PORT=
|
DB_PORT=
|
||||||
|
|
|
||||||
|
|
@ -362,7 +362,7 @@ func (co *controller) getMerchImage(c *gin.Context) {
|
||||||
log.WithError(err).Error("Merch | Failed to get merch image")
|
log.WithError(err).Error("Merch | Failed to get merch image")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
c.JSON(http.StatusOK, link)
|
c.JSON(http.StatusOK, ImageLink{Link: link.String()})
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Summary Удалить (безвозвратно) картинки по merch_uuid и query параметрам
|
// @Summary Удалить (безвозвратно) картинки по merch_uuid и query параметрам
|
||||||
|
|
|
||||||
|
|
@ -56,5 +56,4 @@ type UpdateMerchDTO struct {
|
||||||
|
|
||||||
type ImageLink struct {
|
type ImageLink struct {
|
||||||
Link string `json:"link"`
|
Link string `json:"link"`
|
||||||
ETag string `json:"etag"`
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,10 +32,10 @@ func NewHandler(deps Deps) *Handler {
|
||||||
"addr": media,
|
"addr": media,
|
||||||
}).Debug("Merch handler constructor | Media provider")
|
}).Debug("Merch handler constructor | Media provider")
|
||||||
|
|
||||||
exists, err := media.CheckBucketExists(packageBucketName)
|
//exists, err := media.CheckBucketExists(packageBucketName)
|
||||||
if err != nil || !exists {
|
//if err != nil || !exists {
|
||||||
log.WithError(err).Fatal("Merch handler constructor | Failed to ensure bucket exists")
|
// log.WithError(err).Fatal("Merch handler constructor | Failed to ensure bucket exists")
|
||||||
}
|
//}
|
||||||
|
|
||||||
return &Handler{
|
return &Handler{
|
||||||
repo: r,
|
repo: r,
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"merch-parser-api/internal/interfaces"
|
"merch-parser-api/internal/interfaces"
|
||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
|
"net/url"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
@ -303,14 +304,14 @@ func (s *service) uploadMerchImage(ctx context.Context, userUuid, merchUuid, ima
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) getMerchImage(ctx context.Context, userUuid, merchUuid, imageType string) (ImageLink, error) {
|
func (s *service) getMerchImage(ctx context.Context, userUuid, merchUuid, imageType string) (*url.URL, error) {
|
||||||
exists, err := s.repo.merchRecordExists(userUuid, merchUuid)
|
exists, err := s.repo.merchRecordExists(userUuid, merchUuid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ImageLink{}, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if !exists {
|
if !exists {
|
||||||
return ImageLink{}, fmt.Errorf("no merch found for user %s with uuid %s", userUuid, merchUuid)
|
return nil, fmt.Errorf("no merch found for user %s with uuid %s", userUuid, merchUuid)
|
||||||
}
|
}
|
||||||
|
|
||||||
var object string
|
var object string
|
||||||
|
|
@ -320,23 +321,10 @@ func (s *service) getMerchImage(ctx context.Context, userUuid, merchUuid, imageT
|
||||||
case "full":
|
case "full":
|
||||||
object = fmt.Sprintf("%s/merch/%s/full.jpg", userUuid, merchUuid)
|
object = fmt.Sprintf("%s/merch/%s/full.jpg", userUuid, merchUuid)
|
||||||
default:
|
default:
|
||||||
return ImageLink{}, fmt.Errorf("unknown image type %s", imageType)
|
return nil, fmt.Errorf("unknown image type %s", imageType)
|
||||||
}
|
}
|
||||||
|
|
||||||
link, err := s.media.Get(ctx, s.bucketName, object, s.expires, nil)
|
return s.media.Get(ctx, s.bucketName, object, s.expires, nil)
|
||||||
if err != nil {
|
|
||||||
return ImageLink{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
etag, err := s.media.GetObjectEtag(ctx, s.bucketName, object)
|
|
||||||
if err != nil {
|
|
||||||
return ImageLink{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return ImageLink{
|
|
||||||
Link: link.String(),
|
|
||||||
ETag: etag,
|
|
||||||
}, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) deleteMerchImage(ctx context.Context, userUuid, merchUuid string) error {
|
func (s *service) deleteMerchImage(ctx context.Context, userUuid, merchUuid string) error {
|
||||||
|
|
@ -379,7 +367,7 @@ func (s *service) _uploadToStorage(params uploadImageParams) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.WithFields(log.Fields{
|
log.WithFields(log.Fields{
|
||||||
"error": err,
|
"error": err,
|
||||||
"img type": params.imageType,
|
"img type": "full",
|
||||||
}).Error("Merch | Failed to upload file to media storage")
|
}).Error("Merch | Failed to upload file to media storage")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,5 +12,4 @@ type MediaStorage interface {
|
||||||
Upload(ctx context.Context, bucket, object string, reader io.Reader, size int64) error
|
Upload(ctx context.Context, bucket, object string, reader io.Reader, size int64) error
|
||||||
Get(ctx context.Context, bucket, object string, expires time.Duration, params url.Values) (*url.URL, error)
|
Get(ctx context.Context, bucket, object string, expires time.Duration, params url.Values) (*url.URL, error)
|
||||||
Delete(ctx context.Context, bucket, object string) error
|
Delete(ctx context.Context, bucket, object string) error
|
||||||
GetObjectEtag(ctx context.Context, bucketName, object string) (string, error)
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -42,11 +42,3 @@ func (s *Service) Get(ctx context.Context, bucket, object string, expires time.D
|
||||||
func (s *Service) Delete(ctx context.Context, bucket, object string) error {
|
func (s *Service) Delete(ctx context.Context, bucket, object string) error {
|
||||||
return s.client.RemoveObject(ctx, bucket, object, minio.RemoveObjectOptions{})
|
return s.client.RemoveObject(ctx, bucket, object, minio.RemoveObjectOptions{})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) GetObjectEtag(ctx context.Context, bucketName, object string) (string, error) {
|
|
||||||
info, err := s.client.StatObject(ctx, bucketName, object, minio.StatObjectOptions{})
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return info.ETag, nil
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue