feat(service): projects creation and getters implementation

This commit is contained in:
Guz
2025-03-12 10:21:44 -03:00
parent ae10dfa7ca
commit 8fbb9e1671
4 changed files with 171 additions and 14 deletions

View File

@@ -1,33 +1,118 @@
package service
import (
"bytes"
"encoding/xml"
"errors"
"fmt"
"io"
"log/slog"
"forge.capytal.company/capytalcode/project-comicverse/database"
"forge.capytal.company/capytalcode/project-comicverse/internals/randstr"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func (s *service) NewProject() error {
s.assert.NotNil(s.db)
const projectIDLength = 6
id, err := uuid.NewV7()
var (
ErrProjectNotExists = errors.New("project does not exists in database")
ErrProjectInvalidUUID = errors.New("UUID provided is invalid")
)
type Project struct {
XMLName xml.Name `xml:"body"`
ID string `xml:"id,attr"`
Title string `xml:"h1"`
Contents string `xml:"-"`
}
func (s *Service) CreateProject() (Project, error) {
s.assert.NotNil(s.db)
s.assert.NotNil(s.s3)
s.assert.NotNil(s.ctx)
s.assert.NotZero(s.bucket)
s.log.Debug("Creating new project")
id, err := randstr.NewHex(projectIDLength)
if err != nil {
return err
return Project{}, err
}
s.assert.NotZero(id.String(), "UUID should never be invalid")
title := "New Project"
err = s.db.Insert(&database.Project{
ID: id.String(),
Title: "New Project",
s.assert.NotZero(id, "ID should never be empty")
s.log.Debug("Creating project on database", slog.String("id", id))
_, err = s.db.CreateProject(id, title)
if err != nil {
return Project{}, err
}
p := Project{
ID: id,
Title: title,
}
c, err := xml.Marshal(p)
if err != nil {
return Project{}, err
}
s.log.Debug("Creating project on storage", slog.String("id", id))
f := fmt.Sprintf("%s.comic.xml", id)
_, err = s.s3.PutObject(s.ctx, &s3.PutObjectInput{
Bucket: &s.bucket,
Key: &f,
Body: bytes.NewReader(c),
})
if err != nil {
return errors.Join(errors.New("database returned error while inserting new project"), err)
return Project{}, err
}
p.Contents = string(c)
return nil
return p, nil
}
func (s *service) ListProjects() {
func (s *Service) GetProject(id string) (Project, error) {
s.assert.NotNil(s.db)
s.assert.NotNil(s.s3)
s.assert.NotZero(s.bucket)
s.assert.NotNil(s.ctx)
s.assert.NotZero(id)
res, err := s.db.GetProject(id)
if errors.Is(err, database.ErrNoRows) {
return Project{}, errors.Join(ErrProjectNotExists, err)
}
if err != nil {
return Project{}, err
}
p := Project{
ID: res.ID,
Title: res.Title,
}
f := fmt.Sprintf("%s.comic.xml", p.ID)
file, err := s.s3.GetObject(s.ctx, &s3.GetObjectInput{
Bucket: &s.bucket,
Key: &f,
})
if err != nil {
return p, err
}
c, err := io.ReadAll(file.Body)
if err != nil {
return p, err
}
p.Contents = string(c)
return p, nil
}