145 lines
4.5 KiB
Go
145 lines
4.5 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/app/dto"
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/repository"
|
|
)
|
|
|
|
// DeviceTemplateService 定义了应用层的设备模板服务接口。
|
|
type DeviceTemplateService interface {
|
|
CreateDeviceTemplate(ctx context.Context, req *dto.CreateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error)
|
|
GetDeviceTemplate(ctx context.Context, id uint32) (*dto.DeviceTemplateResponse, error)
|
|
ListDeviceTemplates(ctx context.Context) ([]*dto.DeviceTemplateResponse, error)
|
|
UpdateDeviceTemplate(ctx context.Context, id uint32, req *dto.UpdateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error)
|
|
DeleteDeviceTemplate(ctx context.Context, id uint32) error
|
|
}
|
|
|
|
// deviceTemplateService 是 DeviceTemplateService 接口的具体实现。
|
|
type deviceTemplateService struct {
|
|
ctx context.Context
|
|
deviceTemplateRepo repository.DeviceTemplateRepository
|
|
}
|
|
|
|
// NewDeviceTemplateService 创建一个新的 DeviceTemplateService 实例。
|
|
func NewDeviceTemplateService(
|
|
ctx context.Context,
|
|
deviceTemplateRepo repository.DeviceTemplateRepository,
|
|
) DeviceTemplateService {
|
|
return &deviceTemplateService{
|
|
ctx: ctx,
|
|
deviceTemplateRepo: deviceTemplateRepo,
|
|
}
|
|
}
|
|
|
|
func (s *deviceTemplateService) CreateDeviceTemplate(ctx context.Context, req *dto.CreateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error) {
|
|
serviceCtx := logs.AddFuncName(ctx, s.ctx, "CreateDeviceTemplate")
|
|
commandsJSON, err := json.Marshal(req.Commands)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
valuesJSON, err := json.Marshal(req.Values)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
deviceTemplate := &models.DeviceTemplate{
|
|
Name: req.Name,
|
|
Manufacturer: req.Manufacturer,
|
|
Description: req.Description,
|
|
Category: req.Category,
|
|
Commands: commandsJSON,
|
|
Values: valuesJSON,
|
|
}
|
|
|
|
if err := deviceTemplate.SelfCheck(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err := s.deviceTemplateRepo.Create(serviceCtx, deviceTemplate); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return dto.NewDeviceTemplateResponse(deviceTemplate)
|
|
}
|
|
|
|
func (s *deviceTemplateService) GetDeviceTemplate(ctx context.Context, id uint32) (*dto.DeviceTemplateResponse, error) {
|
|
serviceCtx := logs.AddFuncName(ctx, s.ctx, "GetDeviceTemplate")
|
|
deviceTemplate, err := s.deviceTemplateRepo.FindByID(serviceCtx, id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return dto.NewDeviceTemplateResponse(deviceTemplate)
|
|
}
|
|
|
|
func (s *deviceTemplateService) ListDeviceTemplates(ctx context.Context) ([]*dto.DeviceTemplateResponse, error) {
|
|
serviceCtx := logs.AddFuncName(ctx, s.ctx, "ListDeviceTemplates")
|
|
deviceTemplates, err := s.deviceTemplateRepo.ListAll(serviceCtx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return dto.NewListDeviceTemplateResponse(deviceTemplates)
|
|
}
|
|
|
|
func (s *deviceTemplateService) UpdateDeviceTemplate(ctx context.Context, id uint32, req *dto.UpdateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error) {
|
|
serviceCtx := logs.AddFuncName(ctx, s.ctx, "UpdateDeviceTemplate")
|
|
existingDeviceTemplate, err := s.deviceTemplateRepo.FindByID(serviceCtx, id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
commandsJSON, err := json.Marshal(req.Commands)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
valuesJSON, err := json.Marshal(req.Values)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
existingDeviceTemplate.Name = req.Name
|
|
existingDeviceTemplate.Manufacturer = req.Manufacturer
|
|
existingDeviceTemplate.Description = req.Description
|
|
existingDeviceTemplate.Category = req.Category
|
|
existingDeviceTemplate.Commands = commandsJSON
|
|
existingDeviceTemplate.Values = valuesJSON
|
|
|
|
if err := existingDeviceTemplate.SelfCheck(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err := s.deviceTemplateRepo.Update(serviceCtx, existingDeviceTemplate); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return dto.NewDeviceTemplateResponse(existingDeviceTemplate)
|
|
}
|
|
|
|
func (s *deviceTemplateService) DeleteDeviceTemplate(ctx context.Context, id uint32) error {
|
|
serviceCtx := logs.AddFuncName(ctx, s.ctx, "DeleteDeviceTemplate")
|
|
|
|
// 1. 检查是否存在
|
|
_, err := s.deviceTemplateRepo.FindByID(serviceCtx, id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 2. 检查是否被使用(业务逻辑)
|
|
inUse, err := s.deviceTemplateRepo.IsInUse(serviceCtx, id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if inUse {
|
|
return ErrDeviceTemplateInUse // 返回业务错误
|
|
}
|
|
|
|
// 3. 执行删除
|
|
return s.deviceTemplateRepo.Delete(serviceCtx, id)
|
|
}
|