Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cloud_webserver_v2/cmd/cloud_webserver_v2/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ func main() {
handler.NewUploadHandler(router, dbClient, fileProcessor)
handler.NewDocumentationHandler(router, s3Repository)
handler.NewCarMetricsHandler(router, s3Repository, dbClient)
handler.NewfoxgloveConfigHandler(router, s3Repository, dbClient, fileProcessor, &fileUploadMiddleware)

// Graceful shutdown: listen for interrupt signals
quit := make(chan os.Signal, 1)
Expand Down
1 change: 0 additions & 1 deletion cloud_webserver_v2/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,3 @@ services:
volumes:
run_metadata:
matlab_mps_data:
external: true
12 changes: 12 additions & 0 deletions cloud_webserver_v2/internal/database/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ type DatabaseClient struct {
databaseClient *mongo.Client
vehicleRunRepository repository.VehicleRunRepository
carMetricsRepository repository.CarMetricsRepository
foxgloveConfigRepository repository.FoxgloveConfigRepository
}

const VehicleDataDatabase = "vehicle_data_db"
Expand Down Expand Up @@ -55,6 +56,12 @@ func NewDatabaseClient(ctx context.Context, uri string) (*DatabaseClient, error)
}
databaseClient.carMetricsRepository = carMetricsRepository

foxgloveConfigRepository, err := repository.NewMongoFoxgloveConfigRepository(client, vehicleDataDatabase)
if err != nil {
return nil, fmt.Errorf("could not create foxgloveConfigRepository: %v", err)
}
databaseClient.foxgloveConfigRepository = foxgloveConfigRepository

return databaseClient, nil
}

Expand All @@ -66,6 +73,11 @@ func (client *DatabaseClient) CarMetricsUseCase() *usecase.CarMetricsUseCase {
return usecase.NewCarMetricsUseCase(client.carMetricsRepository)
}


func (client *DatabaseClient)FoxgloveConfigUseCase() *usecase.FoxgloveConfigsUseCase {
return usecase.NewFoxgloveConfigsUseCase(client.foxgloveConfigRepository)
}

func (client *DatabaseClient) Disonnect(ctx context.Context) error {
err := client.databaseClient.Disconnect(ctx)
if err != nil {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package repository

import (
"context"
"fmt"

"github.com/hytech-racing/cloud-webserver-v2/internal/models"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
)

const foxgloveConfigFileModel string = "foxglove_configs"

// FoxgloveConfigRepository contains the methods any db implementation needs to implement to interact with foxglove configs
type FoxgloveConfigRepository interface {
GetAllFoxgloveConfigs(ctx context.Context) ([]models.FoxgloveConfigModel, error)
SaveFoxgloveConfig(ctx context.Context, foxgloveconfig models.FoxgloveConfigModel) (models.FoxgloveConfigModel, error)
GetFoxgloveConfigFromId(ctx context.Context, idStr string) (*models.FoxgloveConfigModel, error)
DeleteFoxgloveConfigFromID(ctx context.Context, id primitive.ObjectID) error
}

// MongoFoxgloveConfigRepository conatins all the information needed to interact with a MongoDB implementation of the FoxgloveConfigs db
type MongoFoxgloveConfigRepository struct {
dbClient *mongo.Client
db *mongo.Database
collection *mongo.Collection
}

// MongoFoxgloveConfigRepository creates a new NewMongoFoxgloveConfigRepository with a MongoDB client and database
func NewMongoFoxgloveConfigRepository(dbClient *mongo.Client, database *mongo.Database) (*MongoFoxgloveConfigRepository, error) {
collection := database.Collection(foxgloveConfigFileModel)
if collection == nil {
return nil, fmt.Errorf("could not get collection %s", foxgloveConfigFileModel)
}

return &MongoFoxgloveConfigRepository{
dbClient: dbClient,
db: database,
collection: collection,
}, nil
}

// SaveFoxgloveConfig creates a new Foxglove Config document in the collection.
func (repo *MongoFoxgloveConfigRepository) SaveFoxgloveConfig(ctx context.Context, config models.FoxgloveConfigModel) (models.FoxgloveConfigModel, error) {
res, err := repo.collection.InsertOne(ctx, config)
if err != nil {
return models.FoxgloveConfigModel{}, fmt.Errorf("could not insert foxglove config: %v", err)
}

config.Id = res.InsertedID.(primitive.ObjectID)
return config, nil
}

// GetFoxgloveConfigFromId gets a document from the MongoDB document with its idStr
func (repo *MongoFoxgloveConfigRepository) GetFoxgloveConfigFromId(ctx context.Context, idStr string) (*models.FoxgloveConfigModel, error) {
objID, err := primitive.ObjectIDFromHex(idStr)
if err != nil {
return nil, fmt.Errorf("invalid id: %s", idStr)
}
filter := bson.M{"_id": objID}
result := repo.collection.FindOne(ctx, filter)
if result.Err() != nil {
return nil, result.Err()
}

var model models.FoxgloveConfigModel
err = result.Decode(&model)
if err != nil {
return nil, fmt.Errorf("could not decode result into model: %v", err)
}

return &model, err
}

func (repo *MongoFoxgloveConfigRepository) GetAllFoxgloveConfigs(ctx context.Context) ([]models.FoxgloveConfigModel, error) {
filter := bson.M{}
cursor, err := repo.collection.Find(ctx, filter)
if err != nil {
return nil, err
}

var config []models.FoxgloveConfigModel
if err = cursor.All(ctx, &config); err != nil {
return nil, err
}

return config, nil
}

// Delete a FoxgloveConfigModel from the MongoDB database from a VehicleRun ID
func (repo *MongoFoxgloveConfigRepository) DeleteFoxgloveConfigFromID(ctx context.Context, id primitive.ObjectID) error {
filter := bson.M{"_id": id}
_, err := repo.collection.DeleteOne(ctx, filter)
if err != nil {
return err
}

return nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package usecase

import (
"context"

"github.com/hytech-racing/cloud-webserver-v2/internal/database/repository"
"github.com/hytech-racing/cloud-webserver-v2/internal/models"
"go.mongodb.org/mongo-driver/bson/primitive"

)

type FoxgloveConfigsUseCase struct {
foxgloveConfigsRepo repository.FoxgloveConfigRepository
}

func NewFoxgloveConfigsUseCase(foxgloveConfigsRepo repository.FoxgloveConfigRepository) *FoxgloveConfigsUseCase {
return &FoxgloveConfigsUseCase{
foxgloveConfigsRepo,
}
}

func (uc *FoxgloveConfigsUseCase) CreateFoxgloveConfigs(ctx context.Context, model models.FoxgloveConfigModel) (models.FoxgloveConfigModel, error) {
resModel, err := uc.foxgloveConfigsRepo.SaveFoxgloveConfig(ctx, model)
if err != nil {
return models.FoxgloveConfigModel{}, err
}

return resModel, nil
}

func (uc *FoxgloveConfigsUseCase) GetFoxgloveConfigFromId(ctx context.Context, id string) (*models.FoxgloveConfigModel, error) {
return uc.foxgloveConfigsRepo.GetFoxgloveConfigFromId(ctx, id)
}

func (uc *FoxgloveConfigsUseCase) GetAllFoxgloveConfigs(ctx context.Context) ([]models.FoxgloveConfigModel, error) {
return uc.foxgloveConfigsRepo.GetAllFoxgloveConfigs(ctx)
}

func (uc *FoxgloveConfigsUseCase) DeleteFoxgloveConfigFromId(ctx context.Context, id primitive.ObjectID) error {
return uc.foxgloveConfigsRepo.DeleteFoxgloveConfigFromID(ctx, id)
}
Loading