109 lines
2.2 KiB
Go
109 lines
2.2 KiB
Go
package rest
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type joinRoomRequest struct {
|
|
Room string `json:"room"`
|
|
}
|
|
|
|
type joinRoomResponse struct {
|
|
Room string `json:"room"`
|
|
Token string `json:"token"`
|
|
Url string `json:"url"`
|
|
AppId string `json:"appId"`
|
|
AppName string `json:"appName"`
|
|
Domain string `json:"domain"`
|
|
}
|
|
|
|
type roomHistoryResponse struct {
|
|
RoomName string `json:"roomName"`
|
|
LastJoinedAt time.Time `json:"lastJoinedAt"`
|
|
}
|
|
|
|
func (h *Handler) listRecentRooms(w http.ResponseWriter, r *http.Request) {
|
|
u := userFromRequest(r)
|
|
|
|
limit, offset := pagination(r)
|
|
rooms, err := h.jitsi.RoomHistory(r.Context(), u, limit, offset)
|
|
if err != nil {
|
|
h.fail(w, err)
|
|
return
|
|
}
|
|
|
|
result := make([]roomHistoryResponse, 0, len(rooms))
|
|
for _, room := range rooms {
|
|
result = append(result, roomHistoryResponse{
|
|
RoomName: room.RoomName,
|
|
LastJoinedAt: room.LastJoinedAt,
|
|
})
|
|
}
|
|
|
|
writeJson(w, http.StatusOK, result)
|
|
}
|
|
|
|
func (h *Handler) joinRoom(w http.ResponseWriter, r *http.Request) {
|
|
u := userFromRequest(r)
|
|
|
|
var req joinRoomRequest
|
|
if err := decodeJson(r, &req); err != nil {
|
|
writeError(w, http.StatusBadRequest, "invalid request body")
|
|
return
|
|
}
|
|
|
|
room := strings.TrimSpace(req.Room)
|
|
if room == "" {
|
|
writeError(w, http.StatusBadRequest, "room is required")
|
|
return
|
|
}
|
|
|
|
// Moderator rights are inherited from the user's admin flag.
|
|
moderator := u.IsAdmin
|
|
|
|
token, err := h.jitsi.GenerateToken(
|
|
formatUserId(u.Id),
|
|
u.DisplayedName(),
|
|
room,
|
|
moderator,
|
|
h.avatarURL(r, u.Id),
|
|
)
|
|
if err != nil {
|
|
h.fail(w, err)
|
|
return
|
|
}
|
|
|
|
if err := h.jitsi.RecordRoomJoin(r.Context(), u, room); err != nil {
|
|
h.fail(w, err)
|
|
return
|
|
}
|
|
|
|
writeJson(w, http.StatusOK, joinRoomResponse{
|
|
Room: room,
|
|
Token: token,
|
|
Url: h.jitsi.MeetUrl(room, token),
|
|
AppId: h.jitsi.AppID,
|
|
AppName: h.jitsi.AppName,
|
|
Domain: h.jitsi.Domain,
|
|
})
|
|
}
|
|
|
|
func (h *Handler) deleteRecentRoom(w http.ResponseWriter, r *http.Request) {
|
|
u := userFromRequest(r)
|
|
|
|
room := strings.TrimSpace(r.PathValue("room"))
|
|
if room == "" {
|
|
writeError(w, http.StatusBadRequest, "room is required")
|
|
return
|
|
}
|
|
|
|
if err := h.jitsi.DeleteRoom(r.Context(), u, room); err != nil {
|
|
h.fail(w, err)
|
|
return
|
|
}
|
|
|
|
writeNoContent(w)
|
|
}
|