summaryrefslogtreecommitdiff
path: root/internal/server
diff options
context:
space:
mode:
authorKyren223 <Kyren223@proton.me>2025-01-14 19:09:18 +0200
committerKyren223 <Kyren223@proton.me>2025-01-14 19:09:18 +0200
commit58c6a6d38a5ebbd7bfc9c698227b931a2252e140 (patch)
treefd08e25f2c53e6f035a90b02de615c7190856b21 /internal/server
parent2e1707c45bc78523fa91880dcd407ea886863a68 (diff)
Added the ability to delete messages in frequencies
Diffstat (limited to 'internal/server')
-rw-r--r--internal/server/api/api.go67
-rw-r--r--internal/server/server.go2
2 files changed, 68 insertions, 1 deletions
diff --git a/internal/server/api/api.go b/internal/server/api/api.go
index 4a3c24a..f0d1b1f 100644
--- a/internal/server/api/api.go
+++ b/internal/server/api/api.go
@@ -19,6 +19,7 @@ import (
var (
ErrInternalError = packet.Error{Error: "internal server error"}
ErrPermissionDenied = packet.Error{Error: "permission denied"}
+ ErrNotImplemented = packet.Error{Error: "not implemented yet"}
)
func SendMessage(ctx context.Context, sess *session.Session, request *packet.SendMessage) packet.Payload {
@@ -147,7 +148,7 @@ func RequestMessages(ctx context.Context, sess *session.Session, request *packet
}
if request.ReceiverID != nil && request.FrequencyID == nil {
- return &packet.Error{Error: "receiver message requests are not implemented yet!"}
+ return &ErrNotImplemented
}
return &packet.Error{Error: "either receiver id or frequency id must be specified"}
@@ -826,3 +827,67 @@ func UpdateFrequency(ctx context.Context, sess *session.Session, request *packet
Network: frequency.NetworkID,
})
}
+
+func DeleteMessage(ctx context.Context, sess *session.Session, request *packet.DeleteMessage) packet.Payload {
+ queries := data.New(db)
+
+ message, err := queries.GetMessageById(ctx, request.Message)
+ if err == sql.ErrNoRows {
+ return &packet.Error{Error: "message doesn't exist"}
+ }
+ if err != nil {
+ log.Println("database error 0:", err)
+ return &ErrInternalError
+ }
+
+ if message.FrequencyID != nil {
+ frequency, err := queries.GetFrequencyById(ctx, *message.FrequencyID)
+ if err != nil {
+ log.Println("database error 1:", err)
+ return &ErrInternalError
+ }
+
+ network, err := queries.GetNetworkById(ctx, frequency.NetworkID)
+ if err != nil {
+ log.Println("database error 2:", err)
+ return &ErrInternalError
+ }
+
+ isSessAdmin, err := IsNetworkAdmin(ctx, queries, sess.ID(), frequency.NetworkID)
+ if err != nil {
+ log.Println("database error 3:", err)
+ return &ErrInternalError
+ }
+
+ isSelf := message.SenderID == sess.ID()
+ isAdmin := isSessAdmin && message.SenderID != network.OwnerID
+ isOwner := network.OwnerID == sess.ID()
+ if !isSelf && !isOwner && !isAdmin {
+ return &ErrPermissionDenied
+ }
+
+ err = queries.DeleteMessage(ctx, message.ID)
+ if err != nil {
+ log.Println("database error 4:", err)
+ return &ErrInternalError
+ }
+
+ return NetworkPropagateWithFilter(ctx, sess, frequency.NetworkID, &packet.MessagesInfo{
+ Messages: nil,
+ RemovedMessages: []snowflake.ID{message.ID},
+ }, func(userId snowflake.ID) (pass bool) {
+ if frequency.Perms != packet.PermNoAccess {
+ return true
+ }
+ isAdmin, _ := IsNetworkAdmin(ctx, queries, userId, frequency.NetworkID)
+ return isAdmin
+ })
+ }
+
+ if message.ReceiverID != nil {
+ return &ErrNotImplemented
+ }
+
+ assert.Never("unreachable")
+ return nil
+}
diff --git a/internal/server/server.go b/internal/server/server.go
index 26ab7b7..95c22f6 100644
--- a/internal/server/server.go
+++ b/internal/server/server.go
@@ -361,6 +361,8 @@ func processRequest(ctx context.Context, sess *session.Session, request packet.P
case *packet.SendMessage:
response = timeout(20*time.Millisecond, api.SendMessage, ctx, sess, request)
+ case *packet.DeleteMessage:
+ response = timeout(5*time.Millisecond, api.DeleteMessage, ctx, sess, request)
case *packet.RequestMessages:
response = timeout(50*time.Millisecond, api.RequestMessages, ctx, sess, request)