package gorm import ( "github.com/jinzhu/gorm" "src.dualinventive.com/go/companies-service/internal/domain" "src.dualinventive.com/go/companies-service/internal/storage" "src.dualinventive.com/go/lib/dilog" ) //CompanyRepository reflects a gorm based CompanyRepository type CompanyRepository struct { DB *gorm.DB logger dilog.Logger } var sortMapping = map[domain.SortCol]SortColQuery{ //nolint: gochecknoglobals domain.SortColIDAsc: SortColQueryIDAsc, domain.SortColIDDesc: SortColQueryIDDesc, domain.SortColNameAsc: SortColQueryNameAsc, domain.SortColNameDesc: SortColQueryNameDesc, } //NewCompanyRepository returns a new gorm based storage.CompanyRepository func NewCompanyRepository(logger dilog.Logger, host, port, name, user, pass string) (storage.CompanyRepository, error) { db, err := openDB(host, port, name, user, pass) if err != nil { return nil, err } repo := &CompanyRepository{ DB: db, logger: logger, } return repo, nil } //GetCompanyByID returns a company by the given companyID or nil if not found. func (r *CompanyRepository) GetCompanyByID(companyID uint64) (*domain.Company, error) { var company domain.Company err := r.DB. Where(&domain.Company{ID: uint(companyID)}). First(&company).Error if err == gorm.ErrRecordNotFound { return nil, nil } if err != nil { return nil, err } return &company, nil } //GetCompanies returns all companies or nil if not found. func (r *CompanyRepository) GetCompanies( page uint64, perPage uint64, sort domain.SortCol) ( []domain.Company, uint64, error) { var companies []domain.Company var count uint64 order, ok := sortMapping[sort] if !ok { order = SortColQueryIDAsc } err := r.DB. Where(&domain.Company{ID: uint(0)}). Order(order.String()). Offset((page - 1) * perPage). Limit(perPage). Find(&companies). Offset(0). // Count doesn't work with offset (https://github.com/jinzhu/gorm/issues/1752) Count(&count). Error if err == gorm.ErrRecordNotFound { return nil, 0, nil } if err != nil { return nil, 0, err } return companies, count, nil } // SortColQuery represents the sorting column type SortColQuery string // SortColQuery constants const ( SortColQueryIDAsc SortColQuery = "company_id asc" SortColQueryIDDesc SortColQuery = "company_id desc" SortColQueryNameAsc SortColQuery = "company_name asc" SortColQueryNameDesc SortColQuery = "company_name desc" ) // String for MsgType func (scq SortColQuery) String() string { return string(scq) }