Documentation

Index

Constants

View Source
const SubTPortalName = "subt"

    SubTPortalName is the name of the Org that represents the competition.

    Variables

    This section is empty.

    Functions

    func Initialize

    func Initialize(ctx context.Context, db *gorm.DB)

      Initialize initializes the SubT bundle

      func QueryForRegistrations

      func QueryForRegistrations(q *gorm.DB) *gorm.DB

        QueryForRegistrations returns a gorm query configured to query Registrations.

        Types

        type BucketServer

        type BucketServer interface {
        	GetBucketName(bucket string) string
        	Upload(ctx context.Context, f io.Reader, bucket, fPath string) (*string, error)
        	RemoveFile(ctx context.Context, bucket, fPath string) error
        	GetPresignedURL(ctx context.Context, bucket, fPath string) (*string, error)
        }

          BucketServer is an interface to be followed by Bucket server implementations. Eg. S3

          var BucketServerImpl BucketServer

            BucketServerImpl holds the bucket server to be used.

            type CompetitionParticipant

            type CompetitionParticipant struct {
            	// Override default GORM Model fields
            	ID uint `gorm:"primary_key" json:"-"`
            	// The participant name
            	// Required. Manage the relationship with Organization.
            	// Impl note: It is named Owner to support generic DB query modifiers that
            	// expect the field Owner to represent organizations or users.
            	Owner *string `gorm:"not null;unique_index:idx_active_owner" json:"owner"`
            	// Competition name. Note: A competition is an Organization.
            	Competition *string `json:"competition"`
            	// GORM fields
            	CreatedAt time.Time `gorm:"type:timestamp(3) NULL" json:"created_at"`
            	// Added 2 milliseconds to DeletedAt field
            	DeletedAt *time.Time `gorm:"type:timestamp(2) NULL; unique_index:idx_active_owner" sql:"index" json:"-"`
            	// Private - True to make this a private resource
            	// Impl note: we added the Private field to support generic query modifiers that
            	// expect the private field.
            	Private *bool `json:"private,omitempty"`
            }

              CompetitionParticipant contains the SubT participants extra fields

              type CompetitionParticipants

              type CompetitionParticipants []CompetitionParticipant

                CompetitionParticipants is an slice of CompetitionParticipant

                type CompetitionScore

                type CompetitionScore struct {
                	gorm.Model
                	// Simulation unique identifier. For multisims, this should be the parent's group id.
                	GroupId     *string `gorm:"not null" json:"group_id"`
                	Competition *string `gorm:"not null" json:"competition"`
                	Circuit     *string `gorm:"not null" json:"circuit"`
                	Owner       *string `gorm:"not null" json:"owner"`
                	// Simulation score
                	Score *float64 `gorm:"not null" json:"score"`
                	// Source includes the GroupIds of all simulations that produced this score entry
                	Sources *string `gorm:"size:10000" json:"sources"`
                }

                  CompetitionScore contains scores for competition circuits.

                  type CompetitionScores

                  type CompetitionScores []CompetitionScore

                    CompetitionScores is a list of CompetitionScore

                    type LeaderboardParticipant

                    type LeaderboardParticipant struct {
                    	CompetitionParticipant
                    	Score   *float32 `json:"score,omitempty"`
                    	Circuit *string  `json:"circuit"`
                    }

                      LeaderboardParticipant is a struct that contains participant data and their score

                      type LogFile

                      type LogFile struct {
                      	// Override default GORM Model fields
                      	ID        uint      `gorm:"primary_key" json:"id"`
                      	CreatedAt time.Time `gorm:"type:timestamp(3) NULL" json:"created_at"`
                      	UpdatedAt time.Time `json:"updated_at,omitempty"`
                      	// Added 2 milliseconds to DeletedAt field, and added it to the unique index to help disambiguate
                      	// when soft deleted rows are involved.
                      	DeletedAt *time.Time `gorm:"type:timestamp(2) NULL" sql:"index" json:"-"`
                      	// Unique identifier
                      	UUID *string `json:"-"`
                      	// Location in bucket
                      	Location *string `json:"location,omitempty"`
                      	// The owner of this resource (must exist in UniqueOwners). Can be user or org.
                      	Owner *string `json:"owner,omitempty"`
                      	// The username of the User that created this resource (usually got from the JWT)
                      	Creator *string `json:"creator,omitempty"`
                      	// Private - True to make this a private resource
                      	Private *bool `json:"private,omitempty"`
                      
                      	// Competition name. A competition is an Organization
                      	Competition *string `json:"competition,omitempty"`
                      	// Submission status. A value from St* contants
                      	Status *int     `validate:"omitempty,gte=0,lte=2" json:"status"`
                      	Score  *float32 `json:"score,omitempty"`
                      	// Resolution Date
                      	ResolvedAt *time.Time `gorm:"type:timestamp(3) NULL" json:"resolved_at,omitempty"`
                      	// Optional comments
                      	// Interesting post about TEXT vs VARCHAR(30000) performance:
                      	// https://nicj.net/mysql-text-vs-varchar-performance/
                      	Comments *string `gorm:"type:text" json:"comments,omitempty"`
                      }

                        LogFile represents a Log file submitted in a competition.

                        type LogFiles

                        type LogFiles []LogFile

                          LogFiles is a list of LogFile

                          type LogService

                          type LogService struct{}

                            LogService is the main struct exported by this service.

                            func (*LogService) CreateLog

                            func (s *LogService) CreateLog(ctx context.Context, tx *gorm.DB, f io.Reader,
                            	filename, comp string, ls *LogSubmission, user *users.User) (*LogFile, *ign.ErrMsg)

                              CreateLog submits a new (pending) log file. user argument is the active user requesting the operation.

                              func (*LogService) GetLogFile

                              func (s *LogService) GetLogFile(ctx context.Context, tx *gorm.DB,
                              	comp string, id uint, user *users.User) (*LogFile, *ign.ErrMsg)

                                GetLogFile returns a single log file record. user argument is the active user requesting the operation.

                                func (*LogService) GetLogFileForDownload

                                func (s *LogService) GetLogFileForDownload(ctx context.Context, tx *gorm.DB,
                                	comp string, id uint, user *users.User) (*string, *ign.ErrMsg)

                                  GetLogFileForDownload returns an URL (for downloading) a log file. user argument is the active user requesting the operation.

                                  func (*LogService) LogFileList

                                  func (s *LogService) LogFileList(pr *ign.PaginationRequest, tx *gorm.DB, comp string,
                                  	owner *string, status SubmissionStatus, reqUser *users.User) (*LogFiles, *ign.PaginationResult, *ign.ErrMsg)

                                    LogFileList returns a list of paginated log files. Members of the submitting team can see the list of log files they submitted. Members of the organizing group (eg. SubT) can see all log files.

                                    func (*LogService) RemoveLogFile

                                    func (s *LogService) RemoveLogFile(ctx context.Context, tx *gorm.DB, comp string,
                                    	id uint, user *users.User) (*LogFile, *ign.ErrMsg)

                                      RemoveLogFile removes a log file. user argument is the active user requesting the operation. Returns the removed log file

                                      func (*LogService) UpdateLogFile

                                      func (s *LogService) UpdateLogFile(ctx context.Context, tx *gorm.DB, comp string,
                                      	id uint, su *SubmissionUpdate, user *users.User) (*LogFile, *ign.ErrMsg)

                                        UpdateLogFile updates a log file. Eg. sets score and status. user argument is the active user requesting the operation.

                                        type LogSubmission

                                        type LogSubmission struct {
                                        	// Optional Owner. Must be a user or an org.
                                        	// If not set, the current user will be used as owner
                                        	Owner string `validate:"required" form:"owner"`
                                        	// Optional description
                                        	Description string `form:"description"`
                                        	// One or more files
                                        	// required: true
                                        	File string `json:"file" validate:"omitempty,gt=0" form:"-"`
                                        	// Optional privacy/visibility setting.
                                        	Private *bool `validate:"omitempty" form:"private"`
                                        }

                                          LogSubmission encapsulates data required to submit a log file from a client

                                          type Portal

                                          type Portal struct {
                                          	// Override default GORM Model fields
                                          	ID        uint      `gorm:"primary_key" json:"-"`
                                          	CreatedAt time.Time `gorm:"type:timestamp(3) NULL" json:"created_at"`
                                          	UpdatedAt time.Time `json:"updated_at"`
                                          	// Adds deletedAt to the unique index to help disambiguate when soft deleted rows are involved.
                                          	DeletedAt *time.Time `gorm:"type:timestamp(2) NULL; unique_index:idx_name_owner" sql:"index" json:"-"`
                                          	// Unique identifier
                                          	UUID *string `json:"-"`
                                          	// Location on disk
                                          	Location *string `json:"-"`
                                          	// The name of the resource
                                          	// Added to the name_owner unique index.
                                          	Name *string `gorm:"unique_index:idx_name_owner" json:"name,omitempty"`
                                          	// The owner of this resource (must exist in UniqueOwners). Can be user or org.
                                          	// Also added to the name_owner unique index
                                          	Owner *string `gorm:"unique_index:idx_name_owner" json:"owner,omitempty"`
                                          	// The username of the User that created this resource (usually got from the JWT)
                                          	Creator *string `json:"creator,omitempty"`
                                          	// Private - True to make this a private resource
                                          	Private *bool `json:"private,omitempty"`
                                          	// A description of the model (max 65,535 chars)
                                          	// Interesting post about TEXT vs VARCHAR(30000) performance:
                                          	// https://nicj.net/mysql-text-vs-varchar-performance/
                                          	Description *string `gorm:"type:text" json:"description,omitempty"`
                                          }

                                            Portal contains the data for portals TODO: extract this into a "super" Resource struct.

                                            type RegStatus

                                            type RegStatus uint

                                              RegStatus are possible status values of registrations

                                              const (
                                              	RegOpPending RegStatus = iota
                                              	RegOpDone
                                              	RegOpRejected
                                              )

                                                Registration operation related constants

                                                type Registration

                                                type Registration struct {
                                                
                                                	// ID is public as we want to use it in requests from clients
                                                	ID        uint      `gorm:"primary_key" json:"-"`
                                                	CreatedAt time.Time `gorm:"type:timestamp(3) NULL" json:"created_at"`
                                                	// Added 2 milliseconds to DeletedAt field
                                                	DeletedAt *time.Time `gorm:"type:timestamp(2) NULL" sql:"index" json:"-"`
                                                	// Competition name. Note: A competition is an Organization.
                                                	Competition *string `json:"competition"`
                                                	// Resolution Date
                                                	ResolvedAt *time.Time `gorm:"type:timestamp(3) NULL" json:"resolved_at,omitempty"`
                                                	// The status of the registration. Expects one of the RegOp* constants.
                                                	Status *int `json:"status"`
                                                	// Related Fuel Organization (by name). It is the "team".
                                                	Participant *string `json:"participant"`
                                                	// The username of the User that requested this
                                                	Creator *string `json:"creator"`
                                                }

                                                  Registration models the table that tracks a team registration for SubT.

                                                  type RegistrationCreate

                                                  type RegistrationCreate struct {
                                                  	Participant string `validate:"required,alphanumspace"`
                                                  }

                                                    RegistrationCreate encapsulates data required to create a new pending registration.

                                                    type RegistrationUpdate

                                                    type RegistrationUpdate struct {
                                                    	Competition string    `json:"-"`
                                                    	Participant string    `json:"-"`
                                                    	Resolution  RegStatus `validate:"required,gte=1,lte=2"`
                                                    }

                                                      RegistrationUpdate encapsulates data required to resolve a pending registration

                                                      type Registrations

                                                      type Registrations []Registration

                                                        Registrations is a list of registrations

                                                        type S3Bucket

                                                        type S3Bucket struct {
                                                        	// contains filtered or unexported fields
                                                        }

                                                          S3Bucket is responsible of interacting with AWS S3. The following environment variables must be set: AWS_REGION AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY

                                                          func NewS3Bucket

                                                          func NewS3Bucket(pre string) *S3Bucket

                                                            NewS3Bucket initializes a new S3Bucket. arg pre is the prefix to use in Bucket names.

                                                            func (*S3Bucket) GetBucketName

                                                            func (s3b *S3Bucket) GetBucketName(bucket string) string

                                                              GetBucketName is an s3 implementation to get a bucket name in the cloud

                                                              func (*S3Bucket) GetPresignedURL

                                                              func (s3b *S3Bucket) GetPresignedURL(ctx context.Context, bucket,
                                                              	fPath string) (*string, error)

                                                                GetPresignedURL returns presigned urls from S3 buckets.

                                                                func (*S3Bucket) RemoveFile

                                                                func (s3b *S3Bucket) RemoveFile(ctx context.Context, bucket, fPath string) error

                                                                  RemoveFile is an implementation to remove files from a bucket in S3

                                                                  func (*S3Bucket) Upload

                                                                  func (s3b *S3Bucket) Upload(ctx context.Context, f io.Reader, bucket,
                                                                  	fPath string) (*string, error)

                                                                    Upload is an s3 implementation to upload files to a bucket

                                                                    type Service

                                                                    type Service struct{}

                                                                      Service is the main struct exported by this service.

                                                                      func (*Service) ApplyToSubT

                                                                      func (s *Service) ApplyToSubT(ctx context.Context, tx *gorm.DB,
                                                                      	orgName string, user *users.User) (*Registration, *ign.ErrMsg)

                                                                        ApplyToSubT registers a new (pending) registration to join SubT. user argument is the active user requesting the operation. The orgName argument is the organization that will be registered as a 'participant team'.

                                                                        func (*Service) CreateRegistration

                                                                        func (s *Service) CreateRegistration(ctx context.Context, tx *gorm.DB,
                                                                        	comp, orgName string, user *users.User) (*Registration, *ign.ErrMsg)

                                                                          CreateRegistration registers a new (pending) registration to join a competition. user argument is the active user requesting the operation. The orgName argument is the organization that will be registered as a 'team'. TODO: this should be moved to generic a Registrations bundle.

                                                                          func (*Service) DeleteParticipant

                                                                          func (s *Service) DeleteParticipant(ctx context.Context, tx *gorm.DB,
                                                                          	comp, orgName string, requestor *users.User) (*CompetitionParticipant, *ign.ErrMsg)

                                                                            DeleteParticipant removes a registered participant. The requestor argument is the active user requesting the operation. Returns the deleted participant

                                                                            func (*Service) DeleteRegistration

                                                                            func (s *Service) DeleteRegistration(ctx context.Context, tx *gorm.DB,
                                                                            	comp, orgName string, requestor *users.User) (*Registration, *ign.ErrMsg)

                                                                              DeleteRegistration cancels a pending registration. The requestor argument is the active user requesting the operation. Returns the canceled registration

                                                                              func (*Service) Leaderboard

                                                                              func (s *Service) Leaderboard(pr *ign.PaginationRequest, tx *gorm.DB, comp string, circuit *string,
                                                                              	owner *string) (interface{}, *ign.PaginationResult, *ign.ErrMsg)

                                                                                Leaderboard returns a paginated list with all competition participants sorted by their score.

                                                                                func (*Service) ParticipantsList

                                                                                func (s *Service) ParticipantsList(pr *ign.PaginationRequest, tx *gorm.DB, comp string,
                                                                                	reqUser *users.User) (*users.OrganizationResponses, *ign.PaginationResult, *ign.ErrMsg)

                                                                                  ParticipantsList returns a list of paginated participants (organizations).

                                                                                  func (*Service) RegistrationList

                                                                                  func (s *Service) RegistrationList(pr *ign.PaginationRequest, tx *gorm.DB, comp string,
                                                                                  	status RegStatus, reqUser *users.User) (*Registrations, *ign.PaginationResult, *ign.ErrMsg)

                                                                                    RegistrationList returns a list of paginated registrations. Only the admins of the competition and the user that applied the registration should be able to see registrations.

                                                                                    func (*Service) ResolveRegistration

                                                                                    func (s *Service) ResolveRegistration(ctx context.Context, tx *gorm.DB,
                                                                                    	ru *RegistrationUpdate, requestor *users.User) (*Registration, *ign.ErrMsg)

                                                                                      ResolveRegistration updates a registration. Usually to set a resolution (approve / reject). The requestor argument is the active user requesting the operation (an admin).

                                                                                      type SubmissionStatus

                                                                                      type SubmissionStatus uint

                                                                                        SubmissionStatus are possible status values of LogFile submissions.

                                                                                        const (
                                                                                        	StForReview SubmissionStatus = iota
                                                                                        	StDone
                                                                                        	StRejected
                                                                                        )

                                                                                          Submission status related constants

                                                                                          type SubmissionUpdate

                                                                                          type SubmissionUpdate struct {
                                                                                          	// Submission status. A value from St* contants
                                                                                          	Status SubmissionStatus `validate:"gte=0,lte=2"`
                                                                                          	Score  float32
                                                                                          	// Optional comments
                                                                                          	// Interesting post about TEXT vs VARCHAR(30000) performance:
                                                                                          	// https://nicj.net/mysql-text-vs-varchar-performance/
                                                                                          	Comments *string `json:"comments,omitempty"`
                                                                                          }

                                                                                            SubmissionUpdate encapsulates data required to score an existing a log file.