server/internal/async/entityController.go (68 lines of code) (raw):

package async import ( "context" "database/sql" "errors" "fmt" "github.com/Azure/aks-async/database" opbus "github.com/Azure/aks-async/operationsbus" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "github.com/Azure/aks-middleware/grpc/server/ctxlogger" ) type EntityFactoryFunc func(string) opbus.Entity var _ opbus.EntityController = &EntityController{} type EntityController struct { dbClient *sql.DB entityTableName string matcher *opbus.Matcher } func NewEntityController(ctx context.Context, options Options, matcher *opbus.Matcher, dbClient *sql.DB) (*EntityController, error) { logger := ctxlogger.GetLogger(ctx) if options.EntityTableName == "" { logger.Error("No EntityTableName provided.") return nil, errors.New("No EntityTableName provided.") } if matcher == nil { logger.Error("No matcher provided.") return nil, errors.New("No matcher provided.") } if dbClient == nil { logger.Error("No dbClient provided.") return nil, errors.New("No dbClient provided.") } newEntityController := &EntityController{ dbClient: dbClient, entityTableName: options.EntityTableName, matcher: matcher, } return newEntityController, nil } func (e *EntityController) GetEntity(ctx context.Context, opReq opbus.OperationRequest) (opbus.Entity, error) { logger := ctxlogger.GetLogger(ctx) logger.Info("Getting entity with id: " + opReq.EntityId) queryEntity := fmt.Sprintf("SELECT last_operation_id FROM %s WHERE entity_id = @p1", e.entityTableName) rows, err := database.QueryDb(ctx, e.dbClient, queryEntity, opReq.EntityId) if err != nil { logger.Error("Error executing query: " + err.Error()) return nil, status.Error(codes.Internal, err.Error()) } defer rows.Close() var lastOperationId string if rows.Next() { err := rows.Scan(&lastOperationId) if err != nil { logger.Info("Error scanning row: " + err.Error()) return nil, status.Error(codes.Internal, err.Error()) } } else { logger.Error("No rows returned for entityId: " + opReq.EntityId) return nil, status.Error(codes.NotFound, "EntityId not found in database.") } entity, err := e.matcher.CreateEntityInstance(opReq.OperationName, lastOperationId) if err != nil { logger.Error("Something went wrong creating the entity instance: " + err.Error()) return nil, err } return entity, nil }