summaryrefslogtreecommitdiff
path: root/internal/server/api/api.go
diff options
context:
space:
mode:
authorKyren223 <Kyren223@proton.me>2025-01-04 18:35:44 +0200
committerKyren223 <Kyren223@proton.me>2025-01-04 18:35:44 +0200
commit614cc4d9dabc0e058ee149fbc2fcff866ae62a41 (patch)
tree4f2c674520dc3105ea3c9c549704cca7e1db294d /internal/server/api/api.go
parentfeb8562dd0b6a0ec35781e80756dc3761e6b1ade (diff)
Implemented joining functionality
Diffstat (limited to 'internal/server/api/api.go')
-rw-r--r--internal/server/api/api.go110
1 files changed, 110 insertions, 0 deletions
diff --git a/internal/server/api/api.go b/internal/server/api/api.go
index 9f29ad7..852e07e 100644
--- a/internal/server/api/api.go
+++ b/internal/server/api/api.go
@@ -411,3 +411,113 @@ func DeleteNetwork(ctx context.Context, sess *session.Session, request *packet.D
Set: false,
}
}
+
+func SetNetworkUser(ctx context.Context, sess *session.Session, request packet.SetNetworkUser) packet.Payload {
+ queries := data.New(db)
+
+ network, err := queries.GetNetworkById(ctx, request.Network)
+ if err != nil {
+ log.Println("database error 1:", err)
+ return &ErrInternalError
+ }
+
+ member, err := queries.GetNetworkMemberById(ctx, data.GetNetworkMemberByIdParams{
+ NetworkID: request.Network,
+ UserID: request.User,
+ })
+
+ wantsToJoin := request.Member != nil && *request.Member && request.User == sess.ID()
+ if err == sql.ErrNoRows && network.IsPublic && wantsToJoin {
+ _, err = queries.SetNetworkUser(ctx, data.SetNetworkUserParams{
+ UserID: request.User,
+ NetworkID: request.Network,
+ IsMember: true,
+ IsAdmin: false,
+ IsMuted: false,
+ IsBanned: false,
+ BanReason: nil,
+ })
+ if err != nil {
+ log.Println("database error 2:", err)
+ return &ErrInternalError
+ }
+
+ payload, err := GetSingleNetworkInfo(ctx, queries, network)
+ if err != nil {
+ log.Println("database error 3:", err)
+ return &ErrInternalError
+ }
+
+ return payload
+ }
+
+ if err != nil {
+ log.Println("database error 4:", err)
+ return &ErrInternalError
+ }
+
+ isSessAdmin, err := IsNetworkAdmin(ctx, queries, sess.ID(), request.Network)
+ if err != nil {
+ log.Println("database error 5:", err)
+ return &ErrInternalError
+ }
+
+ isMember := member.IsMember
+ isAdmin := member.IsAdmin
+ isMuted := member.IsMuted
+ IsBanned := member.IsBanned
+ banReason := member.BanReason
+
+ if request.Member != nil && !IsBanned {
+ isLeave := !*request.Member && request.User == sess.ID()
+ isKick := !*request.Member && isSessAdmin
+ if request.User != network.OwnerID && (isLeave || isKick) {
+ isMember = false
+ isAdmin = false // Important for security
+ }
+ isJoin := *request.Member && request.User == sess.ID() && network.IsPublic
+ if isJoin {
+ isMember = true
+ }
+ } else if request.Admin != nil {
+ if network.OwnerID == sess.ID() && request.User != sess.ID() {
+ isAdmin = *request.Admin
+ }
+ } else if request.Muted != nil {
+ notSelf := request.User != sess.ID()
+ notOwner := request.User != network.OwnerID
+ if isSessAdmin && notSelf && notOwner {
+ isMuted = *request.Muted
+ }
+ } else if request.Banned != nil {
+ notSelf := request.User != sess.ID()
+ notOwner := request.User != network.OwnerID
+ if isSessAdmin && notSelf && notOwner {
+ IsBanned = *request.Banned
+ banReason = request.BanReason
+ isAdmin = false // Important for security
+ }
+ }
+
+ _, err = queries.SetNetworkUser(ctx, data.SetNetworkUserParams{
+ UserID: request.User,
+ NetworkID: request.Network,
+ IsMember: isMember,
+ IsAdmin: isAdmin,
+ IsMuted: isMuted,
+ IsBanned: IsBanned,
+ BanReason: banReason,
+ })
+ if err != nil {
+ log.Println("database error 6:", err)
+ return &ErrInternalError
+ }
+
+ payload, err := GetSingleNetworkInfo(ctx, queries, network)
+ if err != nil {
+ log.Println("database error 7:", err)
+ return &ErrInternalError
+ }
+
+ return payload
+}