Yimaru-BackEnd/internal/domain/report_request.go
Samuel Tariku 485cba3c9c feat: Add new stat stores and reporting functionalities for bets, branches, and wallets
- Introduced BetStatStore, BranchStatStore, and WalletStatStore interfaces for handling statistics.
- Implemented repository methods for fetching and updating bet, branch, and wallet statistics.
- Created reporting services for generating interval reports for bets, branches, companies, and wallets.
- Enhanced CSV writing functionality to support dynamic struct to CSV conversion.
- Added cron jobs for periodic updates of branch and wallet statistics.
- Updated wallet handler to include transaction statistics in the response.
2025-10-29 07:14:38 +03:00

306 lines
8.6 KiB
Go

package domain
import (
"fmt"
"time"
dbgen "github.com/SamuelTariku/FortuneBet-Backend/gen/db"
)
type ReportRequest struct {
ID int64
CompanyID ValidInt64
RequestedBy ValidInt64
FilePath ValidString
Type ReportRequestType
Status ReportRequestStatus
Metadata ReportMetadataJSON
RejectReason ValidString
CreatedAt time.Time
CompletedAt ValidTime
}
type ReportRequestDetail struct {
ID int64
CompanyID ValidInt64
CompanyName ValidString
CompanySlug ValidString
RequestedBy ValidInt64
RequesterFirstName ValidString
RequesterLastName ValidString
RequesterRole ValidRole
FilePath ValidString
Type ReportRequestType
Status ReportRequestStatus
Metadata ReportMetadataJSON
RejectReason ValidString
CreatedAt time.Time
CompletedAt ValidTime
}
type CreateReportRequest struct {
CompanyID ValidInt64
RequestedBy ValidInt64
Type ReportRequestType
Metadata ReportMetadataJSON
}
type CreateReportRequestReq struct {
Type string `json:"type"`
Metadata ReportMetadataJSON `json:"metadata"`
}
type ReportRequestRes struct {
ID int64 `json:"id"`
RequestedBy *int64 `json:"requested_by,omitempty"`
CompanyID *int64 `json:"company_id,omitempty"`
FilePath *string `json:"file_path,omitempty"`
Type ReportRequestType `json:"type"`
Status string `json:"status"`
RejectReason *string `json:"reject_reason,omitempty"`
Metadata ReportMetadataJSON `json:"metadata"`
CreatedAt time.Time `json:"created_at"`
CompletedAt *string `json:"completed_at,omitempty"`
}
type ReportRequestDetailRes struct {
ID int64 `json:"id"`
CompanyID *int64 `json:"company_id,omitempty"`
CompanyName *string `json:"company_name,omitempty"`
CompanySlug *string `json:"company_slug,omitempty"`
RequestedBy *int64 `json:"requested_by,omitempty"`
RequesterFirstName *string `json:"requester_first_name,omitempty"`
RequesterLastName *string `json:"requester_last_name,omitempty"`
RequesterRole *string `json:"requester_role,omitempty"`
FilePath *string `json:"file_path,omitempty"`
Type ReportRequestType `json:"type"`
Status string `json:"status"`
RejectReason *string `json:"reject_reason,omitempty"`
Metadata ReportMetadataJSON `json:"metadata"`
CreatedAt time.Time `json:"created_at"`
CompletedAt *string `json:"completed_at,omitempty"`
}
type ReportRequestFilter struct {
CompanyID ValidInt64
Type ValidReportRequestType
Status ValidReportRequestStatus
Limit ValidInt32
Offset ValidInt32
RequestedBy ValidInt64
}
type UpdateRequestRequest struct {
ID int64
FilePath ValidString
RejectReason ValidString
Status ValidReportRequestStatus
}
func ConvertDBReportRequest(report dbgen.ReportRequest) (ReportRequest, error) {
parsedMetadataJSON, err := ParseReportMetadataJSON(report.Metadata)
if err != nil {
return ReportRequest{}, fmt.Errorf("failed to parse report metadata: %w", err)
}
return ReportRequest{
ID: report.ID,
CompanyID: ValidInt64{
Value: report.CompanyID.Int64,
Valid: report.CompanyID.Valid,
},
RequestedBy: ValidInt64{
Value: report.RequestedBy.Int64,
Valid: report.RequestedBy.Valid,
},
FilePath: ValidString{
Value: report.FilePath.String,
Valid: report.FilePath.Valid,
},
Type: ReportRequestType(report.Type),
Status: ReportRequestStatus(report.Status),
Metadata: parsedMetadataJSON,
RejectReason: ValidString{
Value: report.RejectReason.String,
Valid: report.RejectReason.Valid,
},
CreatedAt: report.CreatedAt.Time,
CompletedAt: ValidTime{
Value: report.CompletedAt.Time,
Valid: report.CompletedAt.Valid,
},
}, nil
}
func ConvertDBReportRequestList(reports []dbgen.ReportRequest) ([]ReportRequest, error) {
result := make([]ReportRequest, len(reports))
var err error
for i, request := range reports {
result[i], err = ConvertDBReportRequest(request)
if err != nil {
return nil, err
}
}
return result, nil
}
func ConvertDBReportRequestDetail(report dbgen.ReportRequestDetail) (ReportRequestDetail, error) {
parsedMetadataJSON, err := ParseReportMetadataJSON(report.Metadata)
if err != nil {
return ReportRequestDetail{}, fmt.Errorf("failed to parse report metadata: %w", err)
}
return ReportRequestDetail{
ID: report.ID,
CompanyID: ValidInt64{
Value: report.CompanyID.Int64,
Valid: report.CompanyID.Valid,
},
CompanyName: ValidString{
Value: report.CompanyName.String,
Valid: report.CompanyName.Valid,
},
CompanySlug: ValidString{
Value: report.CompanySlug.String,
Valid: report.CompanySlug.Valid,
},
RequestedBy: ValidInt64{
Value: report.RequestedBy.Int64,
Valid: report.RequestedBy.Valid,
},
RequesterFirstName: ValidString{
Value: report.RequesterFirstName.String,
Valid: report.RequesterFirstName.Valid,
},
RequesterLastName: ValidString{
Value: report.RequesterLastName.String,
Valid: report.RequesterLastName.Valid,
},
RequesterRole: ValidRole{
Value: Role(report.RequesterRole.String),
Valid: report.RequesterRole.Valid,
},
FilePath: ValidString{
Value: report.FilePath.String,
Valid: report.FilePath.Valid,
},
Type: ReportRequestType(report.Type),
Status: ReportRequestStatus(report.Status),
Metadata: parsedMetadataJSON,
RejectReason: ValidString{
Value: report.RejectReason.String,
Valid: report.RejectReason.Valid,
},
CreatedAt: report.CreatedAt.Time,
CompletedAt: ValidTime{
Value: report.CompletedAt.Time,
Valid: report.CompletedAt.Valid,
},
}, nil
}
func ConvertDBReportRequestDetailList(reports []dbgen.ReportRequestDetail) ([]ReportRequestDetail, error) {
result := make([]ReportRequestDetail, len(reports))
var err error
for i, request := range reports {
result[i], err = ConvertDBReportRequestDetail(request)
if err != nil {
return nil, err
}
}
return result, nil
}
func ConvertReportRequest(request ReportRequest) ReportRequestRes {
var res ReportRequestRes
if request.RequestedBy.Valid {
res.RequestedBy = &request.RequestedBy.Value
}
if request.CompanyID.Valid {
res.CompanyID = &request.CompanyID.Value
}
if request.FilePath.Valid {
res.FilePath = &request.FilePath.Value
}
if request.RejectReason.Valid {
res.RejectReason = &request.RejectReason.Value
}
if request.CompletedAt.Valid {
str := request.CompletedAt.Value.Format(time.RFC3339)
res.CompletedAt = &str
}
res.ID = request.ID
res.Type = request.Type
res.Status = string(request.Status)
res.Metadata = request.Metadata
res.CreatedAt = request.CreatedAt
return res
}
func ConvertReportRequestList(requests []ReportRequest) []ReportRequestRes {
result := make([]ReportRequestRes, len(requests))
for i, request := range requests {
result[i] = ConvertReportRequest(request)
}
return result
}
func ConvertReportRequestDetail(request ReportRequestDetail) ReportRequestDetailRes {
var res ReportRequestDetailRes
if request.RequestedBy.Valid {
res.RequestedBy = &request.RequestedBy.Value
}
if request.RequesterFirstName.Valid {
res.RequesterFirstName = &request.RequesterFirstName.Value
}
if request.RequesterLastName.Valid {
res.RequesterLastName = &request.RequesterLastName.Value
}
if request.RequesterRole.Valid {
res.RequesterRole = (*string)(&request.RequesterRole.Value)
}
if request.CompanyID.Valid {
res.CompanyID = &request.CompanyID.Value
}
if request.CompanyName.Valid {
res.CompanyName = &request.CompanyName.Value
}
if request.CompanySlug.Valid {
res.CompanySlug = &request.CompanySlug.Value
}
if request.FilePath.Valid {
res.FilePath = &request.FilePath.Value
}
if request.RejectReason.Valid {
res.RejectReason = &request.RejectReason.Value
}
if request.CompletedAt.Valid {
str := request.CompletedAt.Value.Format(time.RFC3339)
res.CompletedAt = &str
}
res.ID = request.ID
res.Type = request.Type
res.Status = string(request.Status)
res.Metadata = request.Metadata
res.CreatedAt = request.CreatedAt
return res
}
func ConvertReportRequestDetailList(requests []ReportRequestDetail) []ReportRequestDetailRes {
result := make([]ReportRequestDetailRes, len(requests))
for i, request := range requests {
result[i] = ConvertReportRequestDetail(request)
}
return result
}