forked from mirrors/homebox
labels create and get
This commit is contained in:
parent
f956ec8eb2
commit
8ece3bd7bf
24 changed files with 850 additions and 132 deletions
60
backend/internal/repo/repo_labels.go
Normal file
60
backend/internal/repo/repo_labels.go
Normal file
|
@ -0,0 +1,60 @@
|
|||
package repo
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/hay-kot/content/backend/ent"
|
||||
"github.com/hay-kot/content/backend/ent/group"
|
||||
"github.com/hay-kot/content/backend/ent/label"
|
||||
"github.com/hay-kot/content/backend/internal/types"
|
||||
)
|
||||
|
||||
type EntLabelRepository struct {
|
||||
db *ent.Client
|
||||
}
|
||||
|
||||
func (r *EntLabelRepository) Get(ctx context.Context, ID uuid.UUID) (*ent.Label, error) {
|
||||
return r.db.Label.Query().
|
||||
Where(label.ID(ID)).
|
||||
WithGroup().
|
||||
WithItems().
|
||||
Only(ctx)
|
||||
}
|
||||
|
||||
func (r *EntLabelRepository) GetAll(ctx context.Context, groupId uuid.UUID) ([]*ent.Label, error) {
|
||||
return r.db.Label.Query().
|
||||
Where(label.HasGroupWith(group.ID(groupId))).
|
||||
WithGroup().
|
||||
All(ctx)
|
||||
}
|
||||
|
||||
func (r *EntLabelRepository) Create(ctx context.Context, groupdId uuid.UUID, data types.LabelCreate) (*ent.Label, error) {
|
||||
label, err := r.db.Label.Create().
|
||||
SetName(data.Name).
|
||||
SetDescription(data.Description).
|
||||
SetColor(data.Color).
|
||||
SetGroupID(groupdId).
|
||||
Save(ctx)
|
||||
|
||||
label.Edges.Group = &ent.Group{ID: groupdId} // bootstrap group ID
|
||||
return label, err
|
||||
}
|
||||
|
||||
func (r *EntLabelRepository) Update(ctx context.Context, data types.LabelUpdate) (*ent.Label, error) {
|
||||
_, err := r.db.Label.UpdateOneID(data.ID).
|
||||
SetName(data.Name).
|
||||
SetDescription(data.Description).
|
||||
SetColor(data.Color).
|
||||
Save(ctx)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return r.Get(ctx, data.ID)
|
||||
}
|
||||
|
||||
func (r *EntLabelRepository) Delete(ctx context.Context, id uuid.UUID) error {
|
||||
return r.db.Label.DeleteOneID(id).Exec(ctx)
|
||||
}
|
|
@ -8,6 +8,7 @@ type AllRepos struct {
|
|||
AuthTokens *EntTokenRepository
|
||||
Groups *EntGroupRepository
|
||||
Locations *EntLocationRepository
|
||||
Labels *EntLabelRepository
|
||||
}
|
||||
|
||||
func EntAllRepos(db *ent.Client) *AllRepos {
|
||||
|
@ -16,5 +17,6 @@ func EntAllRepos(db *ent.Client) *AllRepos {
|
|||
AuthTokens: &EntTokenRepository{db},
|
||||
Groups: &EntGroupRepository{db},
|
||||
Locations: &EntLocationRepository{db},
|
||||
Labels: &EntLabelRepository{db},
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ type AllServices struct {
|
|||
User *UserService
|
||||
Admin *AdminService
|
||||
Location *LocationService
|
||||
Labels *LabelService
|
||||
}
|
||||
|
||||
func NewServices(repos *repo.AllRepos) *AllServices {
|
||||
|
@ -13,5 +14,6 @@ func NewServices(repos *repo.AllRepos) *AllServices {
|
|||
User: &UserService{repos},
|
||||
Admin: &AdminService{repos},
|
||||
Location: &LocationService{repos},
|
||||
Labels: &LabelService{repos},
|
||||
}
|
||||
}
|
||||
|
|
32
backend/internal/services/mappers/labels.go
Normal file
32
backend/internal/services/mappers/labels.go
Normal file
|
@ -0,0 +1,32 @@
|
|||
package mappers
|
||||
|
||||
import (
|
||||
"github.com/hay-kot/content/backend/ent"
|
||||
"github.com/hay-kot/content/backend/internal/types"
|
||||
)
|
||||
|
||||
func ToLabelSummary(label *ent.Label) *types.LabelSummary {
|
||||
return &types.LabelSummary{
|
||||
ID: label.ID,
|
||||
GroupID: label.Edges.Group.ID,
|
||||
Name: label.Name,
|
||||
Description: label.Description,
|
||||
CreatedAt: label.CreatedAt,
|
||||
UpdatedAt: label.UpdatedAt,
|
||||
}
|
||||
}
|
||||
|
||||
func ToLabelSummaryErr(label *ent.Label, err error) (*types.LabelSummary, error) {
|
||||
return ToLabelSummary(label), err
|
||||
}
|
||||
|
||||
func ToLabelOut(label *ent.Label) *types.LabelOut {
|
||||
return &types.LabelOut{
|
||||
LabelSummary: *ToLabelSummary(label),
|
||||
Items: MapEach(label.Edges.Items, ToItemSummary),
|
||||
}
|
||||
}
|
||||
|
||||
func ToLabelOutErr(label *ent.Label, err error) (*types.LabelOut, error) {
|
||||
return ToLabelOut(label), err
|
||||
}
|
63
backend/internal/services/service_labels.go
Normal file
63
backend/internal/services/service_labels.go
Normal file
|
@ -0,0 +1,63 @@
|
|||
package services
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/hay-kot/content/backend/internal/repo"
|
||||
"github.com/hay-kot/content/backend/internal/services/mappers"
|
||||
"github.com/hay-kot/content/backend/internal/types"
|
||||
)
|
||||
|
||||
type LabelService struct {
|
||||
repos *repo.AllRepos
|
||||
}
|
||||
|
||||
func (svc *LabelService) Create(ctx context.Context, groupId uuid.UUID, data types.LabelCreate) (*types.LabelSummary, error) {
|
||||
label, err := svc.repos.Labels.Create(ctx, groupId, data)
|
||||
return mappers.ToLabelSummaryErr(label, err)
|
||||
}
|
||||
|
||||
func (svc *LabelService) Update(ctx context.Context, groupId uuid.UUID, data types.LabelUpdate) (*types.LabelSummary, error) {
|
||||
label, err := svc.repos.Labels.Update(ctx, data)
|
||||
return mappers.ToLabelSummaryErr(label, err)
|
||||
}
|
||||
|
||||
func (svc *LabelService) Delete(ctx context.Context, groupId uuid.UUID, id uuid.UUID) error {
|
||||
label, err := svc.repos.Labels.Get(ctx, id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if label.Edges.Group.ID != groupId {
|
||||
return ErrNotOwner
|
||||
}
|
||||
return svc.repos.Labels.Delete(ctx, id)
|
||||
}
|
||||
|
||||
func (svc *LabelService) Get(ctx context.Context, groupId uuid.UUID, id uuid.UUID) (*types.LabelOut, error) {
|
||||
label, err := svc.repos.Labels.Get(ctx, id)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if label.Edges.Group.ID != groupId {
|
||||
return nil, ErrNotOwner
|
||||
}
|
||||
|
||||
return mappers.ToLabelOut(label), nil
|
||||
}
|
||||
|
||||
func (svc *LabelService) GetAll(ctx context.Context, groupId uuid.UUID) ([]*types.LabelSummary, error) {
|
||||
labels, err := svc.repos.Labels.GetAll(ctx, groupId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
labelsOut := make([]*types.LabelSummary, len(labels))
|
||||
for i, label := range labels {
|
||||
labelsOut[i] = mappers.ToLabelSummary(label)
|
||||
}
|
||||
|
||||
return labelsOut, nil
|
||||
}
|
|
@ -1,7 +1,34 @@
|
|||
package types
|
||||
|
||||
type LabelOut struct{}
|
||||
import (
|
||||
"time"
|
||||
|
||||
type LabelCreate struct{}
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type LabelSummary struct{}
|
||||
type LabelCreate struct {
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
Color string `json:"color"`
|
||||
}
|
||||
|
||||
type LabelUpdate struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
Color string `json:"color"`
|
||||
}
|
||||
|
||||
type LabelSummary struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
GroupID uuid.UUID `json:"groupId"`
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
UpdatedAt time.Time `json:"updatedAt"`
|
||||
}
|
||||
|
||||
type LabelOut struct {
|
||||
LabelSummary
|
||||
Items []*ItemSummary `json:"items"`
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue