add messages persistancy, channels does not persist

This commit is contained in:
cos
2026-05-07 10:27:39 +02:00
parent bcefea3cf5
commit 916463234f
5 changed files with 128 additions and 0 deletions
+76
View File
@@ -3,6 +3,7 @@ package httpRequest
import (
"context"
"encoding/json"
"go-socket/packages/config"
"net/http"
"strings"
"time"
@@ -317,6 +318,81 @@ func HandleHubMessage(response http.ResponseWriter, request *http.Request) {
response.WriteHeader(http.StatusCreated)
}
func HandleHubChannelGetMessages(response http.ResponseWriter, request *http.Request) {
if !validCheckWithResponseOnFail(response, request, normal) {
return
}
ctx := request.Context()
user, hubUser, hub, err := getHubUserIfValidWithResponseOnFail(ctx, response, request)
if err != nil {
return
}
channel, err := getHubChannelIfValidWithResponseOnFail(ctx, response, hub, hubUser, request.FormValue("channel_id"))
if err != nil {
return
}
channel.Mu.RLock()
canReadHistory := channel.UsersCachedPermissions[user.Id].CanReadHistory()
channel.Mu.RUnlock()
if !canReadHistory {
http.Error(response, "forbidden", http.StatusForbidden)
return
}
before, err := convertions.StringToTimestamp(request.URL.Query().Get("before"))
if err != nil {
before = time.Now()
}
messagesCap, err := convertions.StringToUint32(request.URL.Query().Get("messages"))
if err != nil {
messagesCap = config.MaxDirectMsgCache
}
buffer, bufferSize := channel.GetSortedMessagesBuff()
var validBufCount uint32
for validBufCount < bufferSize && buffer[validBufCount].CreatedAt.Before(before) {
validBufCount++
}
var messages []*types.Message
if validBufCount >= messagesCap {
start := validBufCount - messagesCap
messages = make([]*types.Message, messagesCap)
for i := uint32(0); i < messagesCap; i++ {
messages[i] = buffer[start+i]
}
} else {
remaining := messagesCap - validBufCount
cutoff := before
if validBufCount > 0 {
cutoff = buffer[0].CreatedAt
}
dbMessages, err := postgresql.HubChannelGetMessagesBefore(ctx, cutoff, channel.Id, remaining)
if err != nil {
http.Error(response, "internal server error", http.StatusInternalServerError)
return
}
messages = make([]*types.Message, 0, uint32(len(dbMessages))+validBufCount)
messages = append(messages, dbMessages...)
for i := uint32(0); i < validBufCount; i++ {
messages = append(messages, buffer[i])
}
}
data, err := json.Marshal(messages)
if err != nil {
http.Error(response, "internal server error", http.StatusInternalServerError)
return
}
response.WriteHeader(http.StatusOK)
response.Write(data)
}
func HandleGetChannels(response http.ResponseWriter, request *http.Request) {
if !validCheckWithResponseOnFail(response, request, normal) {
return