package repositories import ( "fmt" "time" "xorm.io/xorm" "xps/datamodels" "xps/viewmodels" ) type OcRepo struct { engine *xorm.Engine } func NewOcRepo(engine *xorm.Engine) *OcRepo { return &OcRepo{ engine: engine, } } func (d *OcRepo) GetById(ocId int64) (*viewmodels.OcInfo, error) { sqlSelect := ` SELECT A.oc_id, A.oc_name, A.oc_type_id, A.root_id, A.parent_id, A.admin_id, B.account_name AS admin_name, A.group_id, A.node_left, A.node_right, A.node_level, A.is_leaf, A.status, A.if_lic ` sqlFrom := ` FROM oc AS A LEFT JOIN account AS B ON(A.admin_id = B.account_id) ` sqlWhere := ` WHERE A.deleted_flag = 0 AND A.oc_id = ` + fmt.Sprintf("%d", ocId) data := &viewmodels.OcInfo{} has, err := d.engine.SQL(sqlSelect + sqlFrom + sqlWhere).Get(data) if !has || err != nil { return nil, err } else { return data, nil } } func (d *OcRepo) GetPage(m map[string]interface{})(*viewmodels.PageResult, error) { limit := m["limit"].(int) page := m["page"].(int) sqlSelect := ` SELECT A.oc_id, A.oc_name, A.oc_type_id, A.root_id, A.parent_id, A.admin_id, B.account_name AS admin_name, A.group_id, A.node_left, A.node_right, A.node_level, A.is_leaf, A.status, A.if_lic ` sqlFrom := ` FROM oc AS A LEFT JOIN account AS B ON(A.oc_admin_id = B.account_id) ` sqlWhere := ` WHERE A.deleted_flag = 0 ` if keywords, ok := m["keywords"]; ok { sqlWhere += ` AND A.oc_name like ` + "'%" + fmt.Sprintf("%s", keywords) + "%'" } sqlCount := ` SELECT COUNT(*) ` total, err1 := d.engine.SQL(sqlCount + sqlFrom + sqlWhere).Count() if err1 != nil { return nil, err1 } pageStart := (page - 1) * limit sqlOrderBy := " ORDER BY oc_id ASC " sqlLimit := fmt.Sprintf(" LIMIT %d OFFSET %d ", limit, pageStart) datalist := make([]viewmodels.OcInfo, 0) err2 := d.engine.SQL(sqlSelect + sqlFrom + sqlWhere + sqlOrderBy + sqlLimit).Find(&datalist) if err2 != nil { return nil, err2 } pageResult := &viewmodels.PageResult{} pageResult.Data = datalist pageResult.Total = total pageResult.PageSize = limit pageResult.Page = page return pageResult, nil } func (d *OcRepo) GetList(m map[string]interface{})([]viewmodels.OcInfo, error) { sqlSelect := ` SELECT A.oc_id, A.oc_name, A.oc_type_id, A.root_id, A.parent_id, A.admin_id, B.account_name AS admin_name, A.group_id, A.node_left, A.node_right, A.node_level, A.is_leaf, A.status, A.if_lic ` sqlFrom := ` FROM oc AS A LEFT JOIN account AS B ON(A.oc_admin_id = B.account_id) ` sqlWhere := ` WHERE A.deleted_flag = 0 ` if keywords, ok := m["keywords"]; ok { sqlWhere += ` AND A.oc_name like ` + "'%" + fmt.Sprintf("%s", keywords) + "%'" } sqlOrderBy := " ORDER BY oc_id ASC " datalist := make([]viewmodels.OcInfo, 0) err := d.engine.SQL(sqlSelect + sqlFrom + sqlWhere + sqlOrderBy).Find(&datalist) if err != nil { return nil, err } else { return datalist, nil } } func (d *OcRepo) Delete(m map[string]interface{}) error { ocId := m["ocId"].(int64) data := &datamodels.Oc{DeletedFlag: 1} _, err := d.engine.Where("oc_id = ?", ocId).Update(data) return err } func (d *OcRepo) Update(data *datamodels.Oc) error { ocId := data.OcId data.UpdatedAt = time.Now() _, err := d.engine.Where("oc_id = ?", ocId).Update(data) return err } func (d *OcRepo) Create(data *datamodels.Oc) error { _, err := d.engine.Insert(data) return err } func (d *OcRepo) IncrementLeft(iRoot, steps, iLeft int64) error { sql := fmt.Sprintf("UPDATE oc SET node_left = node_left + %d WHERE root_id = %d AND node_left >= %d AND deleted_flag = 0", iRoot, steps, iLeft) _, err := d.engine.Exec(sql) return err } func (d *OcRepo) IncrementRight(iRoot, steps, iRight int64) error { sql := fmt.Sprintf("UPDATE oc SET node_right = node_right + %d WHERE root_id = %d AND node_right >= %d AND deleted_flag = 0", iRoot, steps, iRight) _, err := d.engine.Exec(sql) return err } func (d *OcRepo) DecrementLeft(iRoot, steps, iLeft int64) error { sql := fmt.Sprintf("UPDATE oc SET node_left = node_left - %d WHERE root_id = %d AND node_left > %d AND deleted_flag = 0", iRoot, steps, iLeft) _, err := d.engine.Exec(sql) return err } func (d *OcRepo) DecrementRight(iRoot, steps int64, iRight int64) error { sql := fmt.Sprintf("UPDATE oc SET node_right = node_right - %d WHERE root_id = %d AND node_right > %d AND deleted_flag = 0", iRoot, steps, iRight) _, err := d.engine.Exec(sql) return err } func (d *OcRepo) BatchDelete(iRootId, iLeft, iRight int64) error { sql := fmt.Sprintf("DELETE FROM oc WHERE root_id = %d AND node_left >= %d AND node_right <= %d ", iRootId, iLeft, iRight) _, err := d.engine.Exec(sql) return err } func (d *OcRepo) CountOfChildren(iRoot, iid int64) (int64, error) { count, err := d.engine. Where("root_id", iRoot). Where("parent_id = ?", iid). Where("deleted_flag = 0 "). Count(new(datamodels.Oc)) if err != nil { return 0, err } return count, nil } func (d *OcRepo) GetAdmin(ocId int64)(*datamodels.Account, error) { sqlSelect := ` SELECT A.* , B.* ` sqlFrom := ` FROM oc AS A LEFT JOIN account AS B ON(A.oc_id = B.oc_id AND A.admin_id = B.account_id) ` sqlWhere := ` WHERE A.deleted_flag = 0 AND A.oc_id = ` + fmt.Sprintf("%d", ocId) data := &datamodels.Account{} has, err := d.engine.SQL(sqlSelect + sqlFrom + sqlWhere).Get(data) if !has || err != nil { return nil, err } else { return data, nil } }