- 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.
306 lines
8.6 KiB
Go
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
|
|
}
|