leaf-library-3/internal/services/workspace/workspace.go

112 lines
3.0 KiB
Go
Raw Normal View History

2024-12-06 15:46:45 +00:00
package workspace
import (
"context"
"leafdev.top/Leaf/leaf-library-3/internal/entity"
"leafdev.top/Leaf/leaf-library-3/internal/types/dto"
"leafdev.top/Leaf/leaf-library-3/internal/types/errs"
"leafdev.top/Leaf/leaf-library-3/internal/types/user"
)
func (s *Service) Get(ctx context.Context, workspaceId dto.EntityId) (*entity.Workspace, error) {
exists, err := s.Exists(ctx, workspaceId)
if err != nil {
return nil, err
}
if !exists {
return nil, errs.ErrWorkspaceNotExists
}
return s.dao.WithContext(ctx).Workspace.Where(s.dao.Workspace.Id.Eq(workspaceId.Uint())).First()
}
func (s *Service) Exists(ctx context.Context, workspaceId dto.EntityId) (bool, error) {
num, err := s.dao.WithContext(ctx).Workspace.Where(s.dao.Workspace.Id.Eq(workspaceId.Uint())).Count()
return num > 0, err
}
func (s *Service) List(ctx context.Context, userId user.Id) ([]*entity.Workspace, error) {
return s.dao.WithContext(ctx).Workspace.Where(s.dao.Workspace.UserId.Eq(userId.String())).Find()
}
func (s *Service) Create(ctx context.Context, userId user.Id, name string) (*entity.Workspace, error) {
var workspace = &entity.Workspace{
Name: name,
UserId: userId,
}
err := s.dao.WithContext(ctx).Workspace.Create(workspace)
if err != nil {
return nil, err
}
_, err = s.AddMember(ctx, userId, workspace)
if err != nil {
return nil, err
}
return workspace, nil
}
func (s *Service) AddMember(ctx context.Context, userId user.Id, workspaceEntity *entity.Workspace) (*entity.WorkspaceMember, error) {
memberExists, err := s.MemberExists(ctx, userId, workspaceEntity)
if err != nil {
return nil, err
}
if memberExists {
return nil, errs.ErrMemberAlreadyExists
}
var workspaceMember = &entity.WorkspaceMember{
UserId: userId,
WorkspaceId: workspaceEntity.Id,
}
err = s.dao.WithContext(ctx).WorkspaceMember.Create(workspaceMember)
return workspaceMember, err
}
func (s *Service) RemoveMember(ctx context.Context, userId user.Id, workspaceEntity *entity.Workspace) error {
memberExists, err := s.MemberExists(ctx, userId, workspaceEntity)
if err != nil {
return err
}
if !memberExists {
return errs.ErrMemberNotExists
}
_, err = s.dao.WithContext(ctx).WorkspaceMember.
Where(
s.dao.WorkspaceMember.UserId.Eq(userId.String()),
s.dao.WorkspaceMember.WorkspaceId.Eq(
workspaceEntity.Id.Uint()),
).
Delete()
return err
}
func (s *Service) MemberExists(ctx context.Context, userId user.Id, workspaceEntity *entity.Workspace) (bool, error) {
if num, err := s.dao.WithContext(ctx).WorkspaceMember.Where(s.dao.WorkspaceMember.UserId.Eq(userId.String()), s.dao.WorkspaceMember.WorkspaceId.Eq(workspaceEntity.Id.Uint())).Count(); err != nil {
return false, err
} else {
return num > 0, nil
}
}
func (s *Service) DeleteWorkspace(ctx context.Context, workspaceId dto.EntityId) error {
// 删除始终是一个复杂的工程,所以先标记为软删除
_, err := s.dao.WithContext(ctx).Workspace.Where(s.dao.Workspace.Id.Eq(workspaceId.Uint())).Delete()
return err
}