package repo import ( "admin/apps/game/domain/entity" "admin/apps/game/model" "admin/internal/consts" "admin/internal/errcode" "errors" "gorm.io/gorm" ) type IProjectRepo interface { EnsureProjectsDBData() ([]*model.Project, error) List() ([]*entity.Project, error) GetByProjectId(id string) (*entity.Project, bool, error) } func NewProjectRepo(db *gorm.DB) IProjectRepo { model.GetProjectServersHandler = func(projectId string) ([]*model.Server, error) { servers := make([]*model.Server, 0) err := db.Where("project_id=?", projectId).Find(&servers).Error return servers, err } return &projectRepoImpl{db: db} } type projectRepoImpl struct { db *gorm.DB } func (impl *projectRepoImpl) EnsureProjectsDBData() ([]*model.Project, error) { var curProjects []*model.Project err := impl.db.Find(&curProjects).Error if err != nil { return nil, errcode.New(errcode.DBError, "find all projects error:%v", err) } for k, v := range consts.RegisteredProjects { find := false for _, cur := range curProjects { if k == cur.ProjectId { find = true break } } if !find { po := &model.Project{ProjectId: k, Name: v.Name} err := impl.db.Create(po).Error if err != nil { return nil, errcode.New(errcode.DBError, "create project:%v error:%v", k, err) } curProjects = append(curProjects, po) } } return curProjects, nil } func (impl *projectRepoImpl) List() ([]*entity.Project, error) { list := make([]*model.Project, 0) err := impl.db.Find(&list).Error if err != nil { return nil, errcode.New(errcode.DBError, "list project error:%v", err) } list1 := make([]*entity.Project, 0, len(list)) for _, v := range list { list1 = append(list1, (&entity.CommonResource{}).FromPo(v).ToProjectEntity()) } return list1, nil } func (impl *projectRepoImpl) GetByProjectId(id string) (*entity.Project, bool, error) { po := &model.Project{} err := impl.db.Where("project_id=?", id).Find(po).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return (&entity.CommonResource{}).FromPo(po).ToProjectEntity(), false, nil } } return (&entity.CommonResource{}).FromPo(po).ToProjectEntity(), true, nil }