Files
base/internal/repository/postgres/asset/mapper.go
2026-04-10 18:25:21 +03:30

250 lines
6.5 KiB
Go

package asset
import (
"encoding/json"
"github.com/google/uuid"
domainAsset "base/internal/domain/asset"
)
func toCategoryModel(category *domainAsset.Category) *CategoryModel {
return &CategoryModel{
ID: category.ID,
Name: category.Name,
Icon: category.Icon,
Color: category.Color,
CardType: category.CardType,
Featured: category.Featured,
Description: category.Description,
}
}
func toCategoryDomain(model *CategoryModel) *domainAsset.Category {
return &domainAsset.Category{
ID: model.ID,
Name: model.Name,
Icon: model.Icon,
Color: model.Color,
CardType: model.CardType,
Featured: model.Featured,
Description: model.Description,
}
}
func toAssetModel(asset *domainAsset.Asset) *Model {
return &Model{
ID: asset.ID,
ProfileID: asset.ProfileID,
Status: int(asset.Status),
AssetCategoryID: asset.AssetCategoryID,
Title: asset.Title,
Description: asset.Description,
Link: asset.Link,
Analytics: asset.Analytics,
CreatedAt: asset.CreatedAt,
UpdatedAt: asset.UpdatedAt,
}
}
func toAssetDomain(model *Model, category *domainAsset.Category, artifacts []domainAsset.Artifact, comments []domainAsset.Comment, reports []domainAsset.Report) *domainAsset.Asset {
cat := domainAsset.Category{}
if category != nil {
cat = *category
}
return &domainAsset.Asset{
ID: model.ID,
ProfileID: model.ProfileID,
Status: domainAsset.Status(model.Status),
AssetCategoryID: model.AssetCategoryID,
AssetCategory: cat,
Title: model.Title,
Description: model.Description,
Link: model.Link,
Analytics: model.Analytics,
Reports: reports,
AssetArtifacts: artifacts,
Comments: comments,
CreatedAt: model.CreatedAt,
UpdatedAt: model.UpdatedAt,
}
}
func copyAssetFromModel(asset *domainAsset.Asset, model *Model) {
asset.ID = model.ID
asset.CreatedAt = model.CreatedAt
asset.UpdatedAt = model.UpdatedAt
}
func toArtifactModels(assetID uuid.UUID, artifacts []domainAsset.Artifact) []ArtifactModel {
models := make([]ArtifactModel, len(artifacts))
for i, a := range artifacts {
models[i] = ArtifactModel{
AssetID: assetID,
Type: a.Type,
DownloadURL: a.DownloadURL,
Price: a.Price,
Title: a.Title,
Description: a.Description,
}
}
return models
}
func toArtifactDomains(models []ArtifactModel) []domainAsset.Artifact {
out := make([]domainAsset.Artifact, len(models))
for i, m := range models {
out[i] = domainAsset.Artifact{
ID: m.ID,
AssetID: m.AssetID,
Type: m.Type,
DownloadURL: m.DownloadURL,
Price: m.Price,
Title: m.Title,
Description: m.Description,
}
}
return out
}
// flattenComments turns a tree of comments (with Replies) into a single slice:
// top-level first, then each comment's replies recursively. Used when saving.
func flattenComments(comments []domainAsset.Comment) []domainAsset.Comment {
var out []domainAsset.Comment
for _, c := range comments {
out = append(out, c)
out = append(out, flattenComments(c.Replies)...)
}
return out
}
func toCommentModels(assetID uuid.UUID, comments []domainAsset.Comment) []CommentModel {
flat := flattenComments(comments)
models := make([]CommentModel, 0, len(flat))
for _, c := range flat {
models = append(models, CommentModel{
AssetID: assetID,
Content: c.Content,
WriterID: c.WriterID,
WriterType: c.WriterType,
ParentID: c.ParentID,
CreatedAt: c.CreatedAt,
UpdatedAt: c.UpdatedAt,
})
}
return models
}
func toCommentDomains(models []CommentModel) []domainAsset.Comment {
out := make([]domainAsset.Comment, len(models))
for i, m := range models {
out[i] = domainAsset.Comment{
ID: m.ID,
AssetID: m.AssetID,
Content: m.Content,
WriterID: m.WriterID,
WriterType: m.WriterType,
ParentID: m.ParentID,
CreatedAt: m.CreatedAt,
UpdatedAt: m.UpdatedAt,
}
}
return buildCommentTree(out)
}
// buildCommentTree turns a flat list of comments (with ParentID set) into a tree:
// top-level comments have Replies populated; nested Replies are not further nested in this type.
func buildCommentTree(flat []domainAsset.Comment) []domainAsset.Comment {
if len(flat) == 0 {
return nil
}
byID := make(map[uuid.UUID]*domainAsset.Comment)
for i := range flat {
flat[i].Replies = nil
byID[flat[i].ID] = &flat[i]
}
// First pass: attach replies to parents
for i := range flat {
c := &flat[i]
if c.ParentID == nil {
continue
}
if parent, ok := byID[*c.ParentID]; ok {
parent.Replies = append(parent.Replies, *c)
}
}
// Second pass: collect top-level comments (with Replies already populated)
var roots []domainAsset.Comment
for i := range flat {
c := &flat[i]
if c.ParentID == nil {
roots = append(roots, *c)
}
}
return roots
}
func toReportModels(assetID uuid.UUID, reports []domainAsset.Report) ([]ReportModel, error) {
models := make([]ReportModel, len(reports))
for i, r := range reports {
reportedBy, err := json.Marshal(r.ReportedBy)
if err != nil {
return nil, err
}
reason, err := json.Marshal(r.Reason)
if err != nil {
return nil, err
}
var attachments json.RawMessage
if len(r.Attachments) > 0 {
attachments, err = json.Marshal(r.Attachments)
if err != nil {
return nil, err
}
}
models[i] = ReportModel{
AssetID: assetID,
ReportedBy: reportedBy,
ReportedAt: r.ReportedAt,
Reason: reason,
Status: int(r.Status),
Notes: r.Notes,
Attachments: attachments,
CreatedAt: r.ReportedAt,
UpdatedAt: r.ReportedAt,
}
}
return models, nil
}
func toReportDomains(models []ReportModel) ([]domainAsset.Report, error) {
out := make([]domainAsset.Report, len(models))
for i, m := range models {
var reportedBy domainAsset.ReportedBy
if err := json.Unmarshal(m.ReportedBy, &reportedBy); err != nil {
return nil, err
}
var reason domainAsset.ReportReason
if err := json.Unmarshal(m.Reason, &reason); err != nil {
return nil, err
}
var attachments []domainAsset.Attachment
if len(m.Attachments) > 0 {
if err := json.Unmarshal(m.Attachments, &attachments); err != nil {
return nil, err
}
}
out[i] = domainAsset.Report{
ID: m.ID,
AssetID: m.AssetID,
ReportedBy: reportedBy,
ReportedAt: m.ReportedAt,
Reason: reason,
Status: domainAsset.ReportStatus(m.Status),
Notes: m.Notes,
Attachments: attachments,
}
}
return out, nil
}