htmgo/examples/todo-list/internal/tasks/service.go

91 lines
2.1 KiB
Go

package tasks
import (
"context"
"github.com/google/uuid"
"github.com/maddalax/htmgo/framework/h"
"github.com/maddalax/htmgo/framework/service"
"time"
"todolist/ent"
"todolist/ent/predicate"
"todolist/ent/task"
"todolist/internal/util"
)
type Service struct {
db *ent.Client
ipAddress string
}
type CreateRequest struct {
Name string
Tags []string
}
func NewService(ctx *h.RequestContext) Service {
return Service{
ipAddress: util.GetClientIp(ctx.Request),
db: service.Get[ent.Client](ctx.ServiceLocator()),
}
}
func (s *Service) Create(request CreateRequest) (*ent.Task, error) {
return s.db.Task.Create().
SetName(request.Name).
SetTags(request.Tags).
SetIPAddress(s.ipAddress).
Save(context.Background())
}
func (s *Service) Get(id uuid.UUID) (*ent.Task, error) {
return s.db.Task.Get(context.Background(), id)
}
func (s *Service) SetName(id uuid.UUID, name string) (*ent.Task, error) {
return s.db.Task.UpdateOneID(id).Where(task.IPAddress(s.ipAddress)).SetName(name).Save(context.Background())
}
func (s *Service) SetAllCompleted(value bool) error {
ctx := context.Background()
updater := s.db.Task.Update()
if value {
updater = updater.SetCompletedAt(time.Now())
} else {
updater = updater.ClearCompletedAt()
}
_, err := updater.
Where(task.IPAddress(s.ipAddress)).
SetUpdatedAt(time.Now()).
Save(ctx)
return err
}
func (s *Service) ClearCompleted() error {
ctx := context.Background()
_, err := s.db.Task.Delete().Where(task.CompletedAtNotNil(), task.IPAddress(s.ipAddress)).Exec(ctx)
return err
}
func (s *Service) SetCompleted(id uuid.UUID, value bool) (*ent.Task, error) {
ctx := context.Background()
updater := s.db.Task.UpdateOneID(id)
if value {
updater = updater.SetCompletedAt(time.Now())
} else {
updater = updater.ClearCompletedAt()
}
return updater.
SetUpdatedAt(time.Now()).
Where(task.IPAddress(s.ipAddress)).
Save(ctx)
}
func (s *Service) List(ps ...predicate.Task) ([]*ent.Task, error) {
ps = append(ps, task.IPAddress(s.ipAddress))
return s.db.Task.Query().Where(ps...).All(context.Background())
}