add messages persistancy, channels does not persist
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user