diff options
Diffstat (limited to 'internal/server')
| -rw-r--r-- | internal/server/api/api.go | 68 | ||||
| -rw-r--r-- | internal/server/server.go | 2 |
2 files changed, 70 insertions, 0 deletions
diff --git a/internal/server/api/api.go b/internal/server/api/api.go index f0d1b1f..24112cf 100644 --- a/internal/server/api/api.go +++ b/internal/server/api/api.go @@ -891,3 +891,71 @@ func DeleteMessage(ctx context.Context, sess *session.Session, request *packet.D assert.Never("unreachable") return nil } + +func EditMessage(ctx context.Context, sess *session.Session, request *packet.EditMessage) packet.Payload { + if len(request.Content) > packet.MaxMessageBytes { + return &packet.Error{Error: fmt.Sprintf( + "message conent must not exceed %v bytes", + packet.MaxMessageBytes, + )} + } + + content := strings.TrimSpace(request.Content) + if content == "" { + return &packet.Error{Error: "message content must not be blank"} + } + + 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 + } + + // Note: it is possible to edit your messages in any frequency + // regardless if you are in the network or if you have access to + // the frequency, as long as you know the message ID + // This should be fine but may be changed later to be more strict + if message.SenderID != sess.ID() { + return &ErrPermissionDenied + } + + editedMessage, err := queries.EditMessage(ctx, data.EditMessageParams{ + Content: content, + ID: message.ID, + }) + if err != nil { + log.Println("database error 4:", err) + return &ErrInternalError + } + + return NetworkPropagateWithFilter(ctx, sess, frequency.NetworkID, &packet.MessagesInfo{ + Messages: []data.Message{editedMessage}, + RemovedMessages: nil, + }, 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 95c22f6..8e69d70 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.EditMessage: + response = timeout(5*time.Millisecond, api.EditMessage, ctx, sess, request) case *packet.DeleteMessage: response = timeout(5*time.Millisecond, api.DeleteMessage, ctx, sess, request) case *packet.RequestMessages: |
