Skip to content

Commit

Permalink
refactor(api,ssh,pkg): move session's events to it own collection
Browse files Browse the repository at this point in the history
  • Loading branch information
henrybarreto committed Feb 28, 2025
1 parent 6023ec1 commit 436380c
Show file tree
Hide file tree
Showing 12 changed files with 702 additions and 104 deletions.
1 change: 1 addition & 0 deletions api/routes/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ func (h *Handler) EventSession(c gateway.Context) error {
}

return h.service.EventSession(c.Ctx(), models.UID(req.UID), &models.SessionEvent{
Session: req.UID,
Type: req.Type,
Timestamp: req.Timestamp,
Data: req.Data,
Expand Down
1 change: 1 addition & 0 deletions api/store/mongo/migrations/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ func GenerateMigrations() []migrate.Migration {
migration89,
migration90,
migration91,
migration92,
}
}

Expand Down
8 changes: 4 additions & 4 deletions api/store/mongo/migrations/migration_90.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,17 @@ var migration90 = migrate.Migration{
}).Info("Applying migration")

filter := bson.M{
"events": bson.M{"$exists": false},
"events.types": bson.M{"$exists": false},
"events.items": bson.M{"$exists": false},
"$or": []bson.M{
{"events": bson.M{"$exists": false}},
{"events": bson.M{"$eq": bson.M{}}},
},
}

update := bson.M{
"$set": bson.M{
"events": bson.M{
"types": bson.A{},
"items": bson.A{},
"seats": bson.A{0},
},
},
}
Expand Down
11 changes: 8 additions & 3 deletions api/store/mongo/migrations/migration_90_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ func TestMigration90Up(t *testing.T) {
_, err := c.
Database("test").
Collection("sessions").
InsertOne(ctx, map[string]interface{}{})
InsertOne(ctx, map[string]interface{}{
"uid": "test",
})

return err
},
Expand All @@ -50,12 +52,16 @@ func TestMigration90Up(t *testing.T) {
query := c.
Database("test").
Collection("sessions").
FindOne(context.TODO(), bson.M{})
FindOne(ctx, bson.M{
"uid": "test",
})

session := make(map[string]interface{})
require.NoError(tt, query.Decode(&session))

require.Contains(tt, session, "events")
require.Contains(tt, session["events"], "types")
require.Contains(tt, session["events"], "items")
})
}
}
Expand All @@ -79,7 +85,6 @@ func TestMigration90Down(t *testing.T) {
InsertOne(ctx, models.Session{
Events: models.SessionEvents{
Types: []string{},
Items: []models.SessionEvent{},
Seats: []int{0},
},
})
Expand Down
100 changes: 80 additions & 20 deletions api/store/mongo/migrations/migration_91.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package migrations
import (
"context"

"github.com/shellhub-io/shellhub/pkg/models"
"github.com/sirupsen/logrus"
migrate "github.com/xakep666/mongo-migrate"
"go.mongodb.org/mongo-driver/bson"
Expand All @@ -11,49 +12,108 @@ import (

var migration91 = migrate.Migration{
Version: 91,
Description: "Adding seat and seats to sessions and event's session",
Description: "Add sessions_events collections",
Up: migrate.MigrationFunc(func(ctx context.Context, db *mongo.Database) error {
logrus.WithFields(logrus.Fields{
"component": "migration",
"version": 91,
"action": "Up",
}).Info("Applying migration")

filter := bson.M{}
if err := db.CreateCollection(ctx, "sessions_events"); err != nil {
return err
}

sessionIndex := mongo.IndexModel{
Keys: bson.M{
"session": 1,
},
}

if _, err := db.Collection("sessions_events").Indexes().CreateOne(ctx, sessionIndex); err != nil {
return err
}

update := bson.M{
"$set": bson.M{
"events.items.$[].seat": 0,
"events.seats": bson.A{0},
typeIndex := mongo.IndexModel{
Keys: bson.M{
"type": 1,
},
}

_, err := db.
Collection("sessions").
UpdateMany(ctx, filter, update)
if _, err := db.Collection("sessions_events").Indexes().CreateOne(ctx, typeIndex); err != nil {
return err
}

cursor, err := db.Collection("sessions").Find(ctx, bson.M{"events.items": bson.M{"$exists": true}})
if err != nil {
return err
}

defer cursor.Close(ctx)

return err
for cursor.Next(ctx) {
var session struct {
UID string `bson:"uid"`
Events struct {
Items []models.SessionEvent `bson:"items"`
} `bson:"events"`
}

if err := cursor.Decode(&session); err != nil {
return err
}

for _, event := range session.Events.Items {
event.Session = session.UID
if _, err := db.Collection("sessions_events").InsertOne(ctx, event); err != nil {
return err
}
}

if _, err := db.Collection("sessions").UpdateOne(ctx, bson.M{
"uid": session.UID,
}, bson.M{
"$unset": bson.M{
"events.items": "",
},
}); err != nil {
return err
}
}

return nil
}),
Down: migrate.MigrationFunc(func(ctx context.Context, db *mongo.Database) error {
logrus.WithFields(logrus.Fields{
"component": "migration",
"version": 91,
"action": "Down",
}).Info("Reverting migration")
cursor, err := db.Collection("sessions_events").Find(ctx, bson.M{})
if err != nil {
return err
}

filter := bson.M{}
defer cursor.Close(ctx)

update := bson.M{
"$unset": bson.M{
"events.items.$[].seat": "",
"events.seats": "",
},
for cursor.Next(ctx) {
var event models.SessionEvent
if err := cursor.Decode(&event); err != nil {
return err
}
sessionID := event.Session

event.Session = ""
update := bson.M{"$push": bson.M{"events.items": event}}
if _, err := db.Collection("sessions").UpdateOne(ctx, bson.M{"uid": sessionID}, update); err != nil {
return err
}
}

_, err := db.
Collection("sessions").
UpdateMany(ctx, filter, update)
if err := db.Collection("sessions_events").Drop(ctx); err != nil {
return err
}

return err
return nil
}),
}
Loading

0 comments on commit 436380c

Please sign in to comment.