clone

a self-hosted multitenant nostr relay with sites, file storage, git hosting, and inbox and outbox delivery

main
tinyrelay / tinyclient / remote_rooms.go
remote_rooms.go 2.5K
1package tinyclient23import (4 "context"5 "errors"6 "net/http"7 "net/url"8 "strconv"9)1011func (a *App) typedBackendRead(w http.ResponseWriter, r *http.Request, actor string) {12 if a.backend.Policy().Features.Grasp08 {13 if err := a.privateReadAllowed(r, actor); err != nil {14 http.Error(w, err.Error(), 403)15 return16 }17 }18 q := r.URL.Query()19 var result any20 var err error21 switch q.Get("op") {22 case "rooms", "room", "thread":23 reader, ok := a.backend.(RoomsReader)24 if !ok {25 http.Error(w, "typed room reads unavailable", 501)26 return27 }28 limit, _ := strconv.Atoi(q.Get("limit"))29 switch q.Get("op") {30 case "rooms":31 result, err = reader.ListRooms(r.Context(), actor, q.Get("cursor"), limit)32 case "room":33 result, err = reader.ReadRoom(r.Context(), actor, q.Get("room"), q.Get("cursor"), limit)34 case "thread":35 result, err = reader.ReadThread(r.Context(), actor, q.Get("room"), q.Get("root"), q.Get("cursor"), limit)36 }37 case "activity":38 reader, ok := a.backend.(ChatActivityReader)39 if !ok {40 http.Error(w, "chat activity unavailable", 501)41 return42 }43 result, err = reader.ReadChatActivity(r.Context(), actor, q.Get("room"), q.Get("root"))44 default:45 err = errors.New("unsupported client read")46 }47 if err != nil {48 http.Error(w, err.Error(), 403)49 return50 }51 writeJSON(w, 200, result)52}5354type remoteRooms struct{ *requestBackend }5556func (b *remoteRooms) ListRooms(ctx context.Context, actor, cursor string, limit int) (RoomList, error) {57 var result RoomList58 err := b.readAsActor(ctx, actor, url.Values{"op": {"rooms"}, "cursor": {cursor}, "limit": {strconv.Itoa(limit)}}, &result)59 return result, err60}61func (b *remoteRooms) ReadRoom(ctx context.Context, actor, room, cursor string, limit int) (RoomPage, error) {62 var result RoomPage63 err := b.readAsActor(ctx, actor, url.Values{"op": {"room"}, "room": {room}, "cursor": {cursor}, "limit": {strconv.Itoa(limit)}}, &result)64 return result, err65}66func (b *remoteRooms) ReadThread(ctx context.Context, actor, room, root, cursor string, limit int) (RoomPage, error) {67 var result RoomPage68 err := b.readAsActor(ctx, actor, url.Values{"op": {"thread"}, "room": {room}, "root": {root}, "cursor": {cursor}, "limit": {strconv.Itoa(limit)}}, &result)69 return result, err70}71func (b *requestBackend) ReadChatActivity(ctx context.Context, actor, room, root string) (any, error) {72 if !b.snapshot.Activity {73 return nil, nil74 }75 var result any76 err := b.readAsActor(ctx, actor, url.Values{"op": {"activity"}, "room": {room}, "root": {root}}, &result)77 return result, err78}