diff options
Diffstat (limited to 'internal/server')
| -rw-r--r-- | internal/server/api/api.go | 67 | ||||
| -rw-r--r-- | internal/server/server.go | 2 |
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) |
