-
Notifications
You must be signed in to change notification settings - Fork 2
/
update_role_priorities.go
104 lines (86 loc) · 1.99 KB
/
update_role_priorities.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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package room
import (
"errors"
"sort"
"github.com/jmoiron/sqlx"
"github.com/kaikourok/lunchtote-backend/entity/model"
"github.com/kaikourok/lunchtote-backend/library/slice"
)
func (db *RoomRepository) UpdateRolePriorities(characterId, roomId int, priorities *[]model.RoomRolePriority) error {
return db.ExecTx(func(tx *sqlx.Tx) error {
err := db.roleTablesAdvisoryLock(roomId, tx)
if err != nil {
return err
}
rows, err := tx.Queryx(`
SELECT
rooms.id,
rooms.master,
rooms_roles.id,
rooms_roles.priority
FROM
rooms
JOIN
rooms_roles ON (rooms.id = rooms_roles.room AND rooms.id = $1)
WHERE
rooms_roles.type = 'MEMBER';
`, roomId)
if err != nil {
return err
}
defer rows.Close()
roleIds := make([]int, 0, len(*priorities))
maxPriority := 0
for rows.Next() {
var roleRoomId, masterId, roleId, prioriry int
err = rows.Scan(
&roleRoomId,
&masterId,
&roleId,
&prioriry,
)
if characterId != masterId {
return errors.New("ルームのロールを変更する権限がありません")
}
if maxPriority < prioriry {
maxPriority = prioriry
}
if err != nil {
return err
}
roleIds = append(roleIds, roleId)
}
if len(roleIds) != len(*priorities) {
return errors.New("指定数が不足しています")
}
for _, priority := range *priorities {
if !slice.Contains(priority.Role, &roleIds) {
return errors.New("ルーム外のIDが指定されています")
}
}
priorities := *priorities
sort.Slice(priorities, func(a, b int) bool {
return priorities[a].Priority > priorities[b].Priority
})
for i := range priorities {
priorities[i].Priority = i + maxPriority + 1
}
for _, priority := range priorities {
_, err = tx.NamedExec(`
UPDATE
rooms_roles
SET
priority = :priority
WHERE
id = :role;
`, priority)
if err != nil {
return err
}
}
if err != nil {
return err
}
return db.attachPermissions(roomId, tx)
})
}