diff --git a/internal/service/post_service.go b/internal/service/post_service.go index 6bd2e7f..e0cfc5b 100644 --- a/internal/service/post_service.go +++ b/internal/service/post_service.go @@ -2,9 +2,15 @@ package service import ( "context" + "encoding/base64" "errors" + "fmt" + "log" + "os" + "strings" "tailly_back_v2/internal/domain" "tailly_back_v2/internal/repository" + "tailly_back_v2/internal/utils" "time" ) @@ -30,6 +36,9 @@ func NewPostService(postRepo repository.PostRepository) PostService { // Создание нового поста func (s *postService) Create(ctx context.Context, authorID int, title, content string) (*domain.Post, error) { + + const op = "service/postService.Create" + // Валидация данных if title == "" { return nil, errors.New("post title cannot be empty") @@ -38,9 +47,36 @@ func (s *postService) Create(ctx context.Context, authorID int, title, content s return nil, errors.New("post content cannot be empty") } + if strings.HasPrefix(content, "data:image/jpeg;base64,") { + content = strings.TrimPrefix(content, "data:image/jpeg;base64,") + } + + imgBase64, err := base64.StdEncoding.DecodeString(content) + if err != nil { + log.Println("failed to decode image base64", op, err) + return nil, err + } + randName := utils.GenerateId() + + upPath := fmt.Sprintf("./uploads/posts/images/%d", authorID) + + err = os.MkdirAll(upPath, os.ModePerm) + if err != nil { + log.Println("failed to create directory", op, err) + return nil, err + } + + fileName := fmt.Sprintf("%s/%s.jpg", upPath, randName) + + err = os.WriteFile(fileName, imgBase64, os.ModePerm) + if err != nil { + log.Println("failed to write file", op, err) + return nil, err + } + post := &domain.Post{ Title: title, - Content: content, + Content: fileName, AuthorID: authorID, CreatedAt: time.Now(), UpdatedAt: time.Now(), diff --git a/internal/utils/rand_name.go b/internal/utils/rand_name.go new file mode 100644 index 0000000..5655b1a --- /dev/null +++ b/internal/utils/rand_name.go @@ -0,0 +1,12 @@ +package utils + +import ( + "crypto/rand" + "fmt" +) + +func GenerateId() string { + b := make([]byte, 16) + rand.Read(b) + return fmt.Sprintf("%x", b) +} diff --git a/uploads/posts/images/1/8eec541e6474071aa848b3ecdd992d6d.jpg b/uploads/posts/images/1/8eec541e6474071aa848b3ecdd992d6d.jpg new file mode 100755 index 0000000..4f7d212 Binary files /dev/null and b/uploads/posts/images/1/8eec541e6474071aa848b3ecdd992d6d.jpg differ diff --git a/uploads/posts/images/1/d59b870db2a935ca6970181e46fbdbef.jpg b/uploads/posts/images/1/d59b870db2a935ca6970181e46fbdbef.jpg new file mode 100755 index 0000000..8b1b106 Binary files /dev/null and b/uploads/posts/images/1/d59b870db2a935ca6970181e46fbdbef.jpg differ