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 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"` 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, }, 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.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 }