/
update_layer_group_orders.go
70 lines (60 loc) · 1.61 KB
/
update_layer_group_orders.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package character
import (
"errors"
"github.com/jmoiron/sqlx"
"github.com/kaikourok/lunchtote-backend/entity/model"
"github.com/kaikourok/lunchtote-backend/library/slice"
)
func (db *CharacterRepository) UpdateLayerGroupOrders(characterId, groupId int, orders *[]model.CharacterIconLayerGroupOrder) error {
return db.ExecTx(func(tx *sqlx.Tx) error {
rows, err := tx.Queryx(`
SELECT
characters_icon_layering_groups.character,
characters_icon_layer_groups.id
FROM
characters_icon_layer_groups
JOIN
characters_icon_layering_groups ON (characters_icon_layering_groups.id = characters_icon_layer_groups.layering_group)
WHERE
characters_icon_layering_groups.id = $1;
`, groupId)
if err != nil {
return err
}
defer rows.Close()
layerIds := make([]int, 0, len(*orders))
for rows.Next() {
var masterId, layerId int
err = rows.Scan(&masterId, &layerId)
if err != nil {
return err
}
if masterId != characterId {
return errors.New("レイヤー順を変更する権限がありません")
}
layerIds = append(layerIds, layerId)
}
if len(layerIds) != len(*orders) {
return errors.New("指定数が不足しています")
}
for _, order := range *orders {
if !slice.Contains(order.LayerGroup, &layerIds) {
return errors.New("レイヤグループ外のIDが指定されています")
}
}
for _, order := range *orders {
_, err = tx.Exec(`
UPDATE
characters_icon_layer_groups
SET
layer_order = $2
WHERE
id = $1;
`, order.LayerGroup, order.Order)
if err != nil {
return err
}
}
return nil
})
}