15420d4d89
Partially rewrote the forum permissions system to make it more stable. Moved config.go into it's own package in /config/ Removed Go Git as a dependency. Tweaked the GopherJS pulling. Fixed inserts where all the columns have default values. Reverted a silly tweak I made thinking that mOrder == order. Removed the /common/ hack from the patcher. Fixed a bug where the forum creator would ignore the visiblity value you provided. The tests now work again. Swapped a misplaced fmt.Println with a fmt.Printf. Fixed a bug in the installer where all the table logs would be on one line in the console. Added more logging to the installer.
76 lines
1.9 KiB
Go
76 lines
1.9 KiB
Go
package common
|
|
|
|
import "database/sql"
|
|
import "../query_gen/lib"
|
|
|
|
var blankGroup = Group{ID: 0, Name: ""}
|
|
|
|
type GroupAdmin struct {
|
|
ID int
|
|
Name string
|
|
Rank string
|
|
RankClass string
|
|
CanEdit bool
|
|
CanDelete bool
|
|
}
|
|
|
|
// ! Fix the data races in the fperms
|
|
type Group struct {
|
|
ID int
|
|
Name string
|
|
IsMod bool
|
|
IsAdmin bool
|
|
IsBanned bool
|
|
Tag string
|
|
Perms Perms
|
|
PermissionsText []byte
|
|
PluginPerms map[string]bool // Custom permissions defined by plugins. What if two plugins declare the same permission, but they handle them in incompatible ways? Very unlikely, we probably don't need to worry about this, the plugin authors should be aware of each other to some extent
|
|
PluginPermsText []byte
|
|
CanSee []int // The IDs of the forums this group can see
|
|
UserCount int // ! Might be temporary as I might want to lean on the database instead for this
|
|
}
|
|
|
|
type GroupStmts struct {
|
|
updateGroupRank *sql.Stmt
|
|
}
|
|
|
|
var groupStmts GroupStmts
|
|
|
|
func init() {
|
|
DbInits.Add(func(acc *qgen.Accumulator) error {
|
|
groupStmts = GroupStmts{
|
|
updateGroupRank: acc.Update("users_groups").Set("is_admin = ?, is_mod = ?, is_banned = ?").Where("gid = ?").Prepare(),
|
|
}
|
|
return acc.FirstError()
|
|
})
|
|
}
|
|
|
|
func (group *Group) ChangeRank(isAdmin bool, isMod bool, isBanned bool) (err error) {
|
|
_, err = groupStmts.updateGroupRank.Exec(isAdmin, isMod, isBanned, group.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
Groups.Reload(group.ID)
|
|
return nil
|
|
}
|
|
|
|
// Copy gives you a non-pointer concurrency safe copy of the group
|
|
func (group *Group) Copy() Group {
|
|
return *group
|
|
}
|
|
|
|
// TODO: Replace this sorting mechanism with something a lot more efficient
|
|
// ? - Use sort.Slice instead?
|
|
type SortGroup []*Group
|
|
|
|
func (sg SortGroup) Len() int {
|
|
return len(sg)
|
|
}
|
|
func (sg SortGroup) Swap(i, j int) {
|
|
sg[i], sg[j] = sg[j], sg[i]
|
|
}
|
|
func (sg SortGroup) Less(i, j int) bool {
|
|
return sg[i].ID < sg[j].ID
|
|
}
|