Realm operations now available in authkit

This commit is contained in:
2024-10-31 22:08:51 +08:00
parent 2b4f71e732
commit c3619f6d25
7 changed files with 295 additions and 129 deletions

View File

@ -1,6 +1,10 @@
package models
import "gorm.io/datatypes"
import (
"git.solsynth.dev/hypernet/nexus/pkg/nex"
"git.solsynth.dev/hypernet/passport/pkg/proto"
"gorm.io/datatypes"
)
type Realm struct {
BaseModel
@ -17,6 +21,22 @@ type Realm struct {
AccountID uint `json:"account_id"`
}
func NewRealmFromProto(proto *proto.RealmInfo) Realm {
return Realm{
BaseModel: BaseModel{
ID: uint(proto.GetId()),
},
Alias: proto.GetAlias(),
Name: proto.GetName(),
Description: proto.GetDescription(),
Avatar: &proto.Avatar,
Banner: &proto.Banner,
IsPublic: proto.GetIsPublic(),
IsCommunity: proto.GetIsCommunity(),
AccessPolicy: nex.DecodeMap(proto.GetAccessPolicy()),
}
}
type RealmMember struct {
BaseModel
@ -26,3 +46,14 @@ type RealmMember struct {
Account Account `json:"account"`
PowerLevel int `json:"power_level"`
}
func NewRealmMemberFromProto(proto *proto.RealmMemberInfo) RealmMember {
return RealmMember{
BaseModel: BaseModel{
ID: uint(proto.GetId()),
},
RealmID: uint(proto.GetRealmId()),
AccountID: uint(proto.GetUserId()),
PowerLevel: int(proto.GetPowerLevel()),
}
}

108
pkg/authkit/realm.go Normal file
View File

@ -0,0 +1,108 @@
package authkit
import (
"git.solsynth.dev/hypernet/nexus/pkg/nex"
"git.solsynth.dev/hypernet/passport/pkg/authkit/models"
"git.solsynth.dev/hypernet/passport/pkg/proto"
"github.com/samber/lo"
)
func GetRealm(nx *nex.Conn, id uint) (models.Realm, error) {
var realm models.Realm
conn, err := nx.GetClientGrpcConn(nex.ServiceTypeAuth)
if err != nil {
return realm, err
}
resp, err := proto.NewRealmServiceClient(conn).GetRealm(nil, &proto.LookupRealmRequest{
Id: lo.ToPtr(uint64(id)),
})
if err != nil {
return realm, err
}
return models.NewRealmFromProto(resp), nil
}
func GetRealmByAlias(nx *nex.Conn, alias string) (models.Realm, error) {
var realm models.Realm
conn, err := nx.GetClientGrpcConn(nex.ServiceTypeAuth)
if err != nil {
return realm, err
}
resp, err := proto.NewRealmServiceClient(conn).GetRealm(nil, &proto.LookupRealmRequest{
Alias: &alias,
})
if err != nil {
return realm, err
}
return models.NewRealmFromProto(resp), nil
}
func ListRealm(nx *nex.Conn, id []uint) ([]models.Realm, error) {
var realms []models.Realm
conn, err := nx.GetClientGrpcConn(nex.ServiceTypeAuth)
if err != nil {
return realms, err
}
resp, err := proto.NewRealmServiceClient(conn).ListRealm(nil, &proto.ListRealmRequest{
Id: lo.Map(id, func(item uint, _ int) uint64 {
return uint64(item)
}),
})
if err != nil {
return realms, err
}
for _, realm := range resp.GetData() {
realms = append(realms, models.NewRealmFromProto(realm))
}
return realms, nil
}
func GetRealmMember(nx *nex.Conn, realmID, userID uint) (models.RealmMember, error) {
var member models.RealmMember
conn, err := nx.GetClientGrpcConn(nex.ServiceTypeAuth)
if err != nil {
return member, err
}
resp, err := proto.NewRealmServiceClient(conn).GetRealmMember(nil, &proto.RealmMemberLookupRequest{
RealmId: lo.ToPtr(uint64(realmID)),
UserId: lo.ToPtr(uint64(userID)),
})
if err != nil {
return member, err
}
return models.NewRealmMemberFromProto(resp), nil
}
func ListRealmMember(nx *nex.Conn, realmID uint) ([]models.RealmMember, error) {
var members []models.RealmMember
conn, err := nx.GetClientGrpcConn(nex.ServiceTypeAuth)
if err != nil {
return members, err
}
resp, err := proto.NewRealmServiceClient(conn).ListRealmMember(nil, &proto.RealmMemberLookupRequest{
RealmId: lo.ToPtr(uint64(realmID)),
})
if err != nil {
return members, err
}
for _, member := range resp.GetData() {
members = append(members, models.NewRealmMemberFromProto(member))
}
return members, nil
}
func CheckRealmMemberPerm(nx *nex.Conn, realmID uint, userID, power int) bool {
conn, err := nx.GetClientGrpcConn(nex.ServiceTypeAuth)
if err != nil {
return false
}
resp, err := proto.NewRealmServiceClient(conn).CheckRealmMemberPerm(nil, &proto.CheckRealmPermRequest{
RealmId: uint64(realmID),
UserId: uint64(userID),
PowerLevel: int32(power),
})
if err != nil {
return false
}
return resp.GetIsSuccess()
}