kopia lustrzana https://codeberg.org/nmkj/audon
fix instant room creation
rodzic
e4659da746
commit
d8a5b3898f
|
@ -32,5 +32,5 @@ app.use(createPinia());
|
|||
app.use(vuetify);
|
||||
app.use(router);
|
||||
|
||||
app.config.compilerOptions.delimiters = ["{%", "%}"];
|
||||
// app.config.compilerOptions.delimiters = ["{%", "%}"];
|
||||
app.mount("#app");
|
||||
|
|
1
error.go
1
error.go
|
@ -14,6 +14,7 @@ var (
|
|||
ErrRoomNotFound = echo.NewHTTPError(http.StatusNotFound, "room_not_found")
|
||||
ErrOperationNotPermitted = echo.NewHTTPError(http.StatusForbidden, "operation_not_permitted")
|
||||
ErrUserNotFound = echo.NewHTTPError(http.StatusNotFound, "user_not_found")
|
||||
ErrAlreadyEnded = echo.NewHTTPError(http.StatusGone, "already_ended")
|
||||
)
|
||||
|
||||
func wrapValidationError(err error) error {
|
||||
|
|
64
room.go
64
room.go
|
@ -32,20 +32,56 @@ func createRoomHandler(c echo.Context) error {
|
|||
return wrapValidationError(err)
|
||||
}
|
||||
|
||||
host := c.Get("user").(*AudonUser)
|
||||
room.Host = host
|
||||
|
||||
coll := mainDB.Collection(COLLECTION_ROOM)
|
||||
|
||||
now := time.Now().UTC()
|
||||
if now.After(room.ScheduledAt) {
|
||||
// host is trying to create an instant room even though there is another instant room that wasn't used, assumed that host won't use such rooms
|
||||
if cur, err := coll.Find(c.Request().Context(),
|
||||
bson.D{
|
||||
{Key: "host.audon_id", Value: host.AudonID},
|
||||
{Key: "ended_at", Value: time.Time{}}, // host didn't close
|
||||
{Key: "$expr", Value: bson.D{ // instant room
|
||||
{Key: "$eq", Value: bson.A{"$created_at", "$scheduled_at"}},
|
||||
}},
|
||||
}); err == nil {
|
||||
defer cur.Close(c.Request().Context())
|
||||
|
||||
roomIDsToBeDeleted := []string{}
|
||||
for cur.Next(c.Request().Context()) {
|
||||
emptyRoom := new(Room)
|
||||
if err := cur.Decode(emptyRoom); err == nil {
|
||||
if !emptyRoom.IsAnyomeInLivekitRoom(c.Request().Context()) {
|
||||
roomIDsToBeDeleted = append(roomIDsToBeDeleted, emptyRoom.RoomID)
|
||||
}
|
||||
}
|
||||
}
|
||||
if len(roomIDsToBeDeleted) > 0 {
|
||||
coll.DeleteMany(c.Request().Context(), bson.D{{
|
||||
Key: "room_id",
|
||||
Value: bson.D{{Key: "$in", Value: roomIDsToBeDeleted}}},
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
room.ScheduledAt = now
|
||||
} else {
|
||||
// TODO: limit the number of rooms one can schedule?
|
||||
}
|
||||
|
||||
// TODO: use a job scheduler to manage rooms?
|
||||
|
||||
room.EndedAt = time.Time{}
|
||||
|
||||
canonic, err := nanoid.Standard(16)
|
||||
if err != nil {
|
||||
return echo.NewHTTPError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
room.RoomID = canonic()
|
||||
|
||||
host := c.Get("user").(*AudonUser)
|
||||
room.Host = host
|
||||
|
||||
now := time.Now().UTC()
|
||||
if now.After(room.ScheduledAt) {
|
||||
room.ScheduledAt = now
|
||||
}
|
||||
|
||||
// if cohosts are already registered, retrieve their data from DB
|
||||
for i, cohost := range room.CoHost {
|
||||
cohostUser, err := findUserByRemote(c.Request().Context(), cohost.RemoteID, cohost.RemoteURL)
|
||||
|
@ -55,7 +91,6 @@ func createRoomHandler(c echo.Context) error {
|
|||
}
|
||||
|
||||
room.CreatedAt = now
|
||||
coll := mainDB.Collection(COLLECTION_ROOM)
|
||||
if _, insertErr := coll.InsertOne(c.Request().Context(), room); insertErr != nil {
|
||||
c.Logger().Error(insertErr)
|
||||
return echo.NewHTTPError(http.StatusInternalServerError)
|
||||
|
@ -65,6 +100,8 @@ func createRoomHandler(c echo.Context) error {
|
|||
}
|
||||
|
||||
func joinRoomHandler(c echo.Context) (err error) {
|
||||
// TODO: decline the request if user is already in the room
|
||||
|
||||
roomID := c.Param("id")
|
||||
if err := mainValidator.Var(&roomID, "required,printascii"); err != nil {
|
||||
return wrapValidationError(err)
|
||||
|
@ -86,7 +123,7 @@ func joinRoomHandler(c echo.Context) (err error) {
|
|||
|
||||
// check if room has already ended
|
||||
if !room.EndedAt.IsZero() && room.EndedAt.Before(now) {
|
||||
return echo.NewHTTPError(http.StatusGone, "already_ended")
|
||||
return ErrAlreadyEnded
|
||||
}
|
||||
|
||||
// return 403 if one has been kicked
|
||||
|
@ -138,6 +175,11 @@ func closeRoomHandler(c echo.Context) error {
|
|||
return echo.NewHTTPError(http.StatusInternalServerError)
|
||||
}
|
||||
|
||||
// return 410 if the room has already ended
|
||||
if !room.EndedAt.IsZero() {
|
||||
return ErrAlreadyEnded
|
||||
}
|
||||
|
||||
// only host can close the room
|
||||
user := c.Get("user").(*AudonUser)
|
||||
if !room.IsHost(user) {
|
||||
|
@ -220,7 +262,7 @@ func getRoomToken(room *Room, user *AudonUser, canTalk bool) (string, error) {
|
|||
|
||||
func getRoomInLivekit(ctx context.Context, roomID string) (*livekit.Room, bool) {
|
||||
rooms, _ := lkRoomServiceClient.ListRooms(ctx, &livekit.ListRoomsRequest{Names: []string{roomID}})
|
||||
if len(rooms.GetRooms()) != 0 {
|
||||
if len(rooms.GetRooms()) == 0 {
|
||||
return nil, false
|
||||
}
|
||||
|
||||
|
|
|
@ -85,6 +85,13 @@ func (r *Room) IsUserInLivekitRoom(ctx context.Context, userID string) bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func (r *Room) IsAnyomeInLivekitRoom(ctx context.Context) bool {
|
||||
participantsInfo, _ := lkRoomServiceClient.ListParticipants(ctx, &livekit.ListParticipantsRequest{Room: r.RoomID})
|
||||
participants := participantsInfo.GetParticipants()
|
||||
|
||||
return len(participants) > 0
|
||||
}
|
||||
|
||||
func createIndexes(ctx context.Context) error {
|
||||
userColl := mainDB.Collection(COLLECTION_USER)
|
||||
userIndexes, err := userColl.Indexes().ListSpecifications(ctx)
|
||||
|
|
Ładowanie…
Reference in New Issue