first endpoint: getting product descriptions

This commit is contained in:
Daniel Goc
2026-03-12 10:18:59 +01:00
parent 6f00e7f784
commit 395c09f7e1
10 changed files with 328 additions and 463 deletions

View File

@@ -0,0 +1,81 @@
package restricted
import (
"strconv"
"git.ma-al.com/goc_daniel/b2b/app/config"
"git.ma-al.com/goc_daniel/b2b/app/service/productDescriptionService"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"github.com/gofiber/fiber/v3"
)
// ProductDescriptionHandler handles endpoints that receive, save and translate product descriptions.
type ProductDescriptionHandler struct {
productDescriptionService *productDescriptionService.ProductDescriptionService
config *config.Config
}
// NewProductDescriptionHandler creates a new ProductDescriptionHandler instance
func NewProductDescriptionHandler() *ProductDescriptionHandler {
productDescriptionService := productDescriptionService.New()
return &ProductDescriptionHandler{
productDescriptionService: productDescriptionService,
config: config.Get(),
}
}
// ProductDescriptionRoutes registers all product description routes
func ProductDescriptionHandlerRoutes(r fiber.Router) fiber.Router {
handler := NewProductDescriptionHandler()
r.Get("/get-product-description", handler.GetProductDescription)
// r.Get("/get-years", handler.GetYears)
// r.Get("/get-quarters", handler.GetQuarters)
// r.Get("/get-issues", handler.GetIssues)
return r
}
// GetProductDescription returns the product description for a given product ID
func (h *ProductDescriptionHandler) GetProductDescription(c fiber.Ctx) error {
userID, ok := c.Locals("userID").(uint)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody), // possibly could return a dfifferent error
})
}
productID_attribute := c.Query("productID")
productID, err := strconv.Atoi(productID_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute),
})
}
productShopID_attribute := c.Query("productShopID")
productShopID, err := strconv.Atoi(productShopID_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute),
})
}
productLangID_attribute := c.Query("productLangID")
productLangID, err := strconv.Atoi(productLangID_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute),
})
}
response, err := h.productDescriptionService.GetProductDescription(userID, uint(productID), uint(productShopID), uint(productLangID))
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, err),
})
}
return c.JSON(response)
}

View File

@@ -1,179 +0,0 @@
package restricted
import (
"strconv"
"git.ma-al.com/goc_daniel/b2b/app/config"
"git.ma-al.com/goc_daniel/b2b/app/service/repoService"
"git.ma-al.com/goc_daniel/b2b/app/utils/pagination"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"github.com/gofiber/fiber/v3"
)
// RepoHandler handles endpoints asking for repository data (to create charts)
type RepoHandler struct {
repoService *repoService.RepoService
config *config.Config
}
// NewRepoHandler creates a new RepoHandler instance
func NewRepoHandler() *RepoHandler {
repoService := repoService.New()
return &RepoHandler{
repoService: repoService,
config: config.Get(),
}
}
// RepoHandlerRoutes registers all repo routes
func RepoHandlerRoutes(r fiber.Router) fiber.Router {
handler := NewRepoHandler()
r.Get("/get-repos", handler.GetRepoIDs)
r.Get("/get-years", handler.GetYears)
r.Get("/get-quarters", handler.GetQuarters)
r.Get("/get-issues", handler.GetIssues)
return r
}
func (h *RepoHandler) GetRepoIDs(c fiber.Ctx) error {
userID, ok := c.Locals("userID").(uint)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody),
})
}
response, err := h.repoService.GetRepositoriesForUser(userID)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, err),
})
}
return c.JSON(response)
}
func (h *RepoHandler) GetYears(c fiber.Ctx) error {
userID, ok := c.Locals("userID").(uint)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody),
})
}
repoID_attribute := c.Query("repoID")
repoID, err := strconv.Atoi(repoID_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadRepoIDAttribute)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrBadRepoIDAttribute),
})
}
response, err := h.repoService.GetYearsForUser(userID, uint(repoID))
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, err),
})
}
return c.JSON(response)
}
func (h *RepoHandler) GetQuarters(c fiber.Ctx) error {
userID, ok := c.Locals("userID").(uint)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody),
})
}
repoID_attribute := c.Query("repoID")
repoID, err := strconv.Atoi(repoID_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadRepoIDAttribute)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrBadRepoIDAttribute),
})
}
year_attribute := c.Query("year")
year, err := strconv.Atoi(year_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadYearAttribute)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrBadYearAttribute),
})
}
response, err := h.repoService.GetQuartersForUser(userID, uint(repoID), uint(year))
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, err),
})
}
return c.JSON(response)
}
func (h *RepoHandler) GetIssues(c fiber.Ctx) error {
userID, ok := c.Locals("userID").(uint)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody),
})
}
repoID_attribute := c.Query("repoID")
repoID, err := strconv.Atoi(repoID_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadRepoIDAttribute)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrBadRepoIDAttribute),
})
}
year_attribute := c.Query("year")
year, err := strconv.Atoi(year_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadYearAttribute)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrBadYearAttribute),
})
}
quarter_attribute := c.Query("quarter")
quarter, err := strconv.Atoi(quarter_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadQuarterAttribute)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrBadQuarterAttribute),
})
}
page_number_attribute := c.Query("page_number")
page_number, err := strconv.Atoi(page_number_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadPaging)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrBadPaging),
})
}
elements_per_page_attribute := c.Query("elements_per_page")
elements_per_page, err := strconv.Atoi(elements_per_page_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadPaging)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrBadPaging),
})
}
var paging pagination.Paging
paging.Page = uint(page_number)
paging.Elements = uint(elements_per_page)
response, err := h.repoService.GetIssuesForUser(userID, uint(repoID), uint(year), uint(quarter), paging)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, err),
})
}
return c.JSON(response)
}

View File

@@ -90,8 +90,8 @@ func (s *Server) Setup() error {
public.AuthHandlerRoutes(auth)
// Repo routes (restricted)
repo := s.restricted.Group("/repo")
restricted.RepoHandlerRoutes(repo)
productDescription := s.restricted.Group("/product-description")
restricted.ProductDescriptionHandlerRoutes(productDescription)
// // Restricted routes example
// restricted := s.api.Group("/restricted")

View File

@@ -0,0 +1,20 @@
package model
// User represents a user in the system
type ProductDescription struct {
ProductID uint `gorm:"column:id_product;primaryKey" json:"product_id"`
ShopID uint `gorm:"column:id_shop;primaryKey" json:"shop_id"`
LangID uint `gorm:"column:id_lang;primaryKey" json:"lang_id"`
Description string `gorm:"column:description;type:text" json:"description"`
DescriptionShort string `gorm:"column:description_short;type:text" json:"description_short"`
LinkRewrite string `gorm:"column:link_rewrite;type:varchar(128)" json:"link_rewrite"`
MetaDescription string `gorm:"column:meta_description;type:varchar(512)" json:"meta_description"`
MetaKeywords string `gorm:"column:meta_keywords;type:varchar(255)" json:"meta_keywords"`
MetaTitle string `gorm:"column:meta_title;type:varchar(128)" json:"meta_title"`
Name string `gorm:"column:name;type:varchar(128)" json:"name"`
AvailableNow string `gorm:"column:available_now;type:varchar(255)" json:"available_now"`
AvailableLater string `gorm:"column:available_later;type:varchar(255)" json:"available_later"`
DeliveryInStock string `gorm:"column:delivery_in_stock;type:varchar(255)" json:"delivery_in_stock"`
DeliveryOutStock string `gorm:"column:delivery_out_stock;type:varchar(255)" json:"delivery_out_stock"`
Usage string `gorm:"column:usage;type:text" json:"usage"`
}

View File

@@ -1,54 +0,0 @@
package model
import (
"time"
"git.ma-al.com/goc_daniel/b2b/app/utils/pagination"
)
// LoginRequest represents the login form data
type DataRequest struct {
RepoID uint `json:"repoid" form:"repoid"`
Step uint `json:"step" form:"step"`
}
type PageMeta struct {
Title string
Description string
}
type QuarterData struct {
Time float64 `json:"time"`
Quarter string `json:"quarter"`
}
type DayData struct {
Date string `json:"date"`
Time float64 `json:"time"`
}
type RepositoryChartData struct {
Years []uint
Quarters []QuarterData
QuartersJSON string
Year uint
}
type TimeTrackedData struct {
RepoId uint
Year uint
Quarter uint
Step string
TotalTime float64
DailyData []DayData
DailyDataJSON string
Years []uint
IssueSummaries *pagination.Found[IssueTimeSummary]
}
type IssueTimeSummary struct {
IssueID uint `gorm:"column:issue_id"`
IssueName string `gorm:"column:issue_name"`
CreatedDate time.Time `gorm:"column:issue_created_at"`
TotalHoursSpent float64 `gorm:"column:total_hours_spent"`
}

View File

@@ -0,0 +1,219 @@
package productDescriptionService
import (
"fmt"
"git.ma-al.com/goc_daniel/b2b/app/db"
"git.ma-al.com/goc_daniel/b2b/app/model"
"gorm.io/gorm"
)
type ProductDescriptionService struct {
db *gorm.DB
}
func New() *ProductDescriptionService {
return &ProductDescriptionService{
db: db.Get(),
}
}
// We assume that any user has access to all product descriptions
func (s *ProductDescriptionService) GetProductDescription(userID uint, productID uint, productShopID uint, productLangID uint) (*model.ProductDescription, error) {
var ProductDescription model.ProductDescription
fmt.Println(userID, productID, productShopID, productLangID)
err := s.db.
Table("ps_product_lang").
Where("id_product = ? AND id_shop = ? AND id_lang = ?", productID, productShopID, productLangID).
First(&ProductDescription).Error
if err != nil {
return nil, fmt.Errorf("database error: %w", err)
}
return &ProductDescription, nil
}
// func (s *ProductDescriptionService) GetRepositoriesForUser(userID uint) ([]uint, error) {
// var repoIDs []uint
// err := s.db.
// Table("customer_repo_accesses").
// Where("user_id = ?", userID).
// Pluck("repo_id", &repoIDs).Error
// if err != nil {
// return nil, fmt.Errorf("database error: %w", err)
// }
// return repoIDs, nil
// }
// func (s *RepoService) UserHasAccessToRepo(userID uint, repoID uint) (bool, error) {
// var repositories []uint
// var err error
// if repositories, err = s.GetRepositoriesForUser(userID); err != nil {
// return false, err
// }
// if !slices.Contains(repositories, repoID) {
// return false, responseErrors.ErrInvalidRepoID
// }
// return true, nil
// }
// // Extract all repositories assigned to user with specific id
// func (s *RepoService) GetYearsForUser(userID uint, repoID uint) ([]uint, error) {
// if ok, err := s.UserHasAccessToRepo(userID, repoID); !ok {
// return nil, err
// }
// years, err := s.GetYears(repoID)
// if err != nil {
// return nil, fmt.Errorf("database error: %w", err)
// }
// return years, nil
// }
// func (s *RepoService) GetYears(repo uint) ([]uint, error) {
// var years []uint
// query := `
// WITH bounds AS (
// SELECT
// MIN(to_timestamp(tt.created_unix)) AS min_ts,
// MAX(to_timestamp(tt.created_unix)) AS max_ts
// FROM tracked_time tt
// JOIN issue i ON i.id = tt.issue_id
// WHERE i.repo_id = ?
// AND tt.deleted = false
// )
// SELECT
// EXTRACT(YEAR FROM y.year_start)::int AS year
// FROM bounds
// CROSS JOIN LATERAL generate_series(
// date_trunc('year', min_ts),
// date_trunc('year', max_ts),
// interval '1 year'
// ) AS y(year_start)
// ORDER BY year
// `
// err := db.Get().Raw(query, repo).Find(&years).Error
// if err != nil {
// return nil, err
// }
// return years, nil
// }
// // Extract all repositories assigned to user with specific id
// func (s *RepoService) GetQuartersForUser(userID uint, repoID uint, year uint) ([]model.QuarterData, error) {
// if ok, err := s.UserHasAccessToRepo(userID, repoID); !ok {
// return nil, err
// }
// response, err := s.GetQuarters(repoID, year)
// if err != nil {
// return nil, fmt.Errorf("database error: %w", err)
// }
// return response, nil
// }
// func (s *RepoService) GetQuarters(repo uint, year uint) ([]model.QuarterData, error) {
// var quarters []model.QuarterData
// query := `
// WITH quarters AS (
// SELECT
// make_date(?::int, 1, 1) + (q * interval '3 months') AS quarter_start,
// q + 1 AS quarter
// FROM generate_series(0, 3) AS q
// ),
// data AS (
// SELECT
// EXTRACT(QUARTER FROM to_timestamp(tt.created_unix)) AS quarter,
// SUM(tt.time) / 3600 AS time
// FROM tracked_time tt
// JOIN issue i ON i.id = tt.issue_id
// JOIN repository r ON i.repo_id = r.id
// WHERE
// EXTRACT(YEAR FROM to_timestamp(tt.created_unix)) = ?
// AND r.id = ?
// AND tt.deleted = false
// GROUP BY EXTRACT(QUARTER FROM to_timestamp(tt.created_unix))
// )
// SELECT
// COALESCE(d.time, 0) AS time,
// CONCAT(EXTRACT(YEAR FROM q.quarter_start)::int, '_Q', q.quarter) AS quarter
// FROM quarters q
// LEFT JOIN data d ON d.quarter = q.quarter
// ORDER BY q.quarter
// `
// err := db.Get().
// Raw(query, year, year, repo).
// Find(&quarters).
// Error
// if err != nil {
// return nil, err
// }
// return quarters, nil
// }
// func (s *RepoService) GetIssuesForUser(
// userID uint,
// repoID uint,
// year uint,
// quarter uint,
// p pagination.Paging,
// ) (*pagination.Found[model.IssueTimeSummary], error) {
// if ok, err := s.UserHasAccessToRepo(userID, repoID); !ok {
// return nil, err
// }
// return s.GetIssues(repoID, year, quarter, p)
// }
// func (s *RepoService) GetIssues(
// repoId uint,
// year uint,
// quarter uint,
// p pagination.Paging,
// ) (*pagination.Found[model.IssueTimeSummary], error) {
// query := db.Get().
// Table("issue i").
// Select(`
// i.id AS issue_id,
// i.name AS issue_name,
// to_timestamp(i.created_unix) AS issue_created_at,
// ROUND(SUM(tt.time) / 3600.0, 2) AS total_hours_spent
// `).
// Joins(`JOIN tracked_time tt ON tt.issue_id = i.id`).
// Joins(`JOIN "user" u ON u.id = tt.user_id`).
// Where("i.repo_id = ?", repoId).
// Where(`
// EXTRACT(YEAR FROM to_timestamp(tt.created_unix)) = ?
// AND EXTRACT(QUARTER FROM to_timestamp(tt.created_unix)) = ?
// `, year, quarter).
// Group(`
// i.id,
// i.name,
// u.id,
// u.full_name
// `).
// Order("i.created_unix")
// result, err := pagination.Paginate[model.IssueTimeSummary](p, query)
// if err != nil {
// return nil, err
// }
// return &result, nil
// }

View File

@@ -1,206 +0,0 @@
package repoService
import (
"fmt"
"slices"
"git.ma-al.com/goc_daniel/b2b/app/db"
"git.ma-al.com/goc_daniel/b2b/app/model"
"git.ma-al.com/goc_daniel/b2b/app/utils/pagination"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"gorm.io/gorm"
)
// type
type RepoService struct {
db *gorm.DB
}
func New() *RepoService {
return &RepoService{
db: db.Get(),
}
}
func (s *RepoService) GetRepositoriesForUser(userID uint) ([]uint, error) {
var repoIDs []uint
err := s.db.
Table("customer_repo_accesses").
Where("user_id = ?", userID).
Pluck("repo_id", &repoIDs).Error
if err != nil {
return nil, fmt.Errorf("database error: %w", err)
}
return repoIDs, nil
}
func (s *RepoService) UserHasAccessToRepo(userID uint, repoID uint) (bool, error) {
var repositories []uint
var err error
if repositories, err = s.GetRepositoriesForUser(userID); err != nil {
return false, err
}
if !slices.Contains(repositories, repoID) {
return false, responseErrors.ErrInvalidRepoID
}
return true, nil
}
// Extract all repositories assigned to user with specific id
func (s *RepoService) GetYearsForUser(userID uint, repoID uint) ([]uint, error) {
if ok, err := s.UserHasAccessToRepo(userID, repoID); !ok {
return nil, err
}
years, err := s.GetYears(repoID)
if err != nil {
return nil, fmt.Errorf("database error: %w", err)
}
return years, nil
}
func (s *RepoService) GetYears(repo uint) ([]uint, error) {
var years []uint
query := `
WITH bounds AS (
SELECT
MIN(to_timestamp(tt.created_unix)) AS min_ts,
MAX(to_timestamp(tt.created_unix)) AS max_ts
FROM tracked_time tt
JOIN issue i ON i.id = tt.issue_id
WHERE i.repo_id = ?
AND tt.deleted = false
)
SELECT
EXTRACT(YEAR FROM y.year_start)::int AS year
FROM bounds
CROSS JOIN LATERAL generate_series(
date_trunc('year', min_ts),
date_trunc('year', max_ts),
interval '1 year'
) AS y(year_start)
ORDER BY year
`
err := db.Get().Raw(query, repo).Find(&years).Error
if err != nil {
return nil, err
}
return years, nil
}
// Extract all repositories assigned to user with specific id
func (s *RepoService) GetQuartersForUser(userID uint, repoID uint, year uint) ([]model.QuarterData, error) {
if ok, err := s.UserHasAccessToRepo(userID, repoID); !ok {
return nil, err
}
response, err := s.GetQuarters(repoID, year)
if err != nil {
return nil, fmt.Errorf("database error: %w", err)
}
return response, nil
}
func (s *RepoService) GetQuarters(repo uint, year uint) ([]model.QuarterData, error) {
var quarters []model.QuarterData
query := `
WITH quarters AS (
SELECT
make_date(?::int, 1, 1) + (q * interval '3 months') AS quarter_start,
q + 1 AS quarter
FROM generate_series(0, 3) AS q
),
data AS (
SELECT
EXTRACT(QUARTER FROM to_timestamp(tt.created_unix)) AS quarter,
SUM(tt.time) / 3600 AS time
FROM tracked_time tt
JOIN issue i ON i.id = tt.issue_id
JOIN repository r ON i.repo_id = r.id
WHERE
EXTRACT(YEAR FROM to_timestamp(tt.created_unix)) = ?
AND r.id = ?
AND tt.deleted = false
GROUP BY EXTRACT(QUARTER FROM to_timestamp(tt.created_unix))
)
SELECT
COALESCE(d.time, 0) AS time,
CONCAT(EXTRACT(YEAR FROM q.quarter_start)::int, '_Q', q.quarter) AS quarter
FROM quarters q
LEFT JOIN data d ON d.quarter = q.quarter
ORDER BY q.quarter
`
err := db.Get().
Raw(query, year, year, repo).
Find(&quarters).
Error
if err != nil {
return nil, err
}
return quarters, nil
}
func (s *RepoService) GetIssuesForUser(
userID uint,
repoID uint,
year uint,
quarter uint,
p pagination.Paging,
) (*pagination.Found[model.IssueTimeSummary], error) {
if ok, err := s.UserHasAccessToRepo(userID, repoID); !ok {
return nil, err
}
return s.GetIssues(repoID, year, quarter, p)
}
func (s *RepoService) GetIssues(
repoId uint,
year uint,
quarter uint,
p pagination.Paging,
) (*pagination.Found[model.IssueTimeSummary], error) {
query := db.Get().
Table("issue i").
Select(`
i.id AS issue_id,
i.name AS issue_name,
to_timestamp(i.created_unix) AS issue_created_at,
ROUND(SUM(tt.time) / 3600.0, 2) AS total_hours_spent
`).
Joins(`JOIN tracked_time tt ON tt.issue_id = i.id`).
Joins(`JOIN "user" u ON u.id = tt.user_id`).
Where("i.repo_id = ?", repoId).
Where(`
EXTRACT(YEAR FROM to_timestamp(tt.created_unix)) = ?
AND EXTRACT(QUARTER FROM to_timestamp(tt.created_unix)) = ?
`, year, quarter).
Group(`
i.id,
i.name,
u.id,
u.full_name
`).
Order("i.created_unix")
result, err := pagination.Paginate[model.IssueTimeSummary](p, query)
if err != nil {
return nil, err
}
return &result, nil
}

View File

@@ -37,12 +37,8 @@ var (
ErrInvalidVerificationToken = errors.New("invalid verification token")
ErrVerificationTokenExpired = errors.New("verification token has expired")
// Typed errors for data extraction
ErrBadRepoIDAttribute = errors.New("invalid repo id attribute")
ErrBadYearAttribute = errors.New("invalid year attribute")
ErrBadQuarterAttribute = errors.New("invalid quarter attribute")
ErrBadPaging = errors.New("invalid paging")
ErrInvalidRepoID = errors.New("repo not accessible")
// Typed errors for product description handler
ErrBadAttribute = errors.New("bad attribute")
)
// Error represents an error with HTTP status code
@@ -112,16 +108,8 @@ func GetErrorCode(c fiber.Ctx, err error) string {
case errors.Is(err, ErrVerificationTokenExpired):
return i18n.T_(c, "error.err_verification_token_expired")
case errors.Is(err, ErrBadRepoIDAttribute):
return i18n.T_(c, "error.err_bad_repo_id_attribute")
case errors.Is(err, ErrBadYearAttribute):
return i18n.T_(c, "error.err_bad_year_attribute")
case errors.Is(err, ErrBadQuarterAttribute):
return i18n.T_(c, "error.err_bad_quarter_attribute")
case errors.Is(err, ErrBadPaging):
return i18n.T_(c, "error.err_bad_paging")
case errors.Is(err, ErrInvalidRepoID):
return i18n.T_(c, "error.err_invalid_repo_id")
case errors.Is(err, ErrBadAttribute):
return i18n.T_(c, "error.err_bad_attribute")
default:
return i18n.T_(c, "error.err_internal_server_error")
@@ -152,11 +140,7 @@ func GetErrorStatus(err error) int {
errors.Is(err, ErrInvalidVerificationToken),
errors.Is(err, ErrVerificationTokenExpired),
errors.Is(err, ErrInvalidPassword),
errors.Is(err, ErrBadRepoIDAttribute),
errors.Is(err, ErrBadYearAttribute),
errors.Is(err, ErrBadQuarterAttribute),
errors.Is(err, ErrBadPaging),
errors.Is(err, ErrInvalidRepoID):
errors.Is(err, ErrBadAttribute):
return fiber.StatusBadRequest
case errors.Is(err, ErrEmailExists):
return fiber.StatusConflict

View File

@@ -1 +1 @@
exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1
exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1

BIN
tmp/main

Binary file not shown.