-
Notifications
You must be signed in to change notification settings - Fork 12
/
table_view_definition_repository.go
107 lines (91 loc) · 4.13 KB
/
table_view_definition_repository.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package repository
import (
"github.com/openline-ai/openline-customer-os/packages/server/customer-os-common-module/tracing"
"github.com/openline-ai/openline-customer-os/packages/server/customer-os-common-module/utils"
"github.com/openline-ai/openline-customer-os/packages/server/customer-os-postgres-repository/entity"
"github.com/openline-ai/openline-customer-os/packages/server/customer-os-postgres-repository/repository/helper"
"github.com/opentracing/opentracing-go"
"github.com/opentracing/opentracing-go/log"
"github.com/pkg/errors"
"golang.org/x/net/context"
"gorm.io/gorm"
)
type tableViewDefinitionRepository struct {
gormDb *gorm.DB
}
type TableViewDefinitionRepository interface {
GetTableViewDefinitions(ctx context.Context, tenant, userId string) helper.QueryResult
CreateTableViewDefinition(ctx context.Context, viewDefinition entity.TableViewDefinition) helper.QueryResult
UpdateTableViewDefinition(ctx context.Context, viewDefinition entity.TableViewDefinition) helper.QueryResult
}
func NewTableViewDefinitionRepository(gormDb *gorm.DB) TableViewDefinitionRepository {
return &tableViewDefinitionRepository{gormDb: gormDb}
}
func (t tableViewDefinitionRepository) GetTableViewDefinitions(ctx context.Context, tenant, userId string) helper.QueryResult {
span, _ := opentracing.StartSpanFromContext(ctx, "TableViewDefinitionRepository.GetTableViewDefinitions")
defer span.Finish()
span.SetTag(tracing.SpanTagComponent, "postgresRepository")
span.SetTag(tracing.SpanTagTenant, tenant)
span.SetTag(tracing.SpanTagUserId, userId)
span.LogFields(log.String("tenant", tenant))
var tableViewDefinitions []entity.TableViewDefinition
err := t.gormDb.
Where("tenant = ?", tenant).
Where("user_id = ?", userId).
Order("position asc").
Find(&tableViewDefinitions).Error
if err != nil {
return helper.QueryResult{Error: err}
}
return helper.QueryResult{Result: tableViewDefinitions}
}
func (t tableViewDefinitionRepository) CreateTableViewDefinition(ctx context.Context, viewDefinition entity.TableViewDefinition) helper.QueryResult {
span, _ := opentracing.StartSpanFromContext(ctx, "TableViewDefinitionRepository.CreateTableViewDefinition")
defer span.Finish()
span.SetTag(tracing.SpanTagComponent, "postgresRepository")
span.SetTag(tracing.SpanTagTenant, viewDefinition.Tenant)
span.SetTag(tracing.SpanTagUserId, viewDefinition.UserId)
err := t.gormDb.Create(&viewDefinition).Error
if err != nil {
tracing.TraceErr(span, err)
return helper.QueryResult{Error: err}
}
span.LogFields(log.Uint64("result.createdID", viewDefinition.ID))
return helper.QueryResult{Result: viewDefinition}
}
func (t tableViewDefinitionRepository) UpdateTableViewDefinition(ctx context.Context, viewDefinition entity.TableViewDefinition) helper.QueryResult {
span, _ := opentracing.StartSpanFromContext(ctx, "TableViewDefinitionRepository.CreateTableViewDefinition")
defer span.Finish()
span.SetTag(tracing.SpanTagComponent, "postgresRepository")
span.SetTag(tracing.SpanTagTenant, viewDefinition.Tenant)
span.SetTag(tracing.SpanTagUserId, viewDefinition.UserId)
// Retrieve the existing record by ID
var existing entity.TableViewDefinition
err := t.gormDb.First(&existing, viewDefinition.ID).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return helper.QueryResult{Error: errors.New("record not found")}
}
return helper.QueryResult{Error: err}
}
// Verify that UserId and TenantName are unchanged
if existing.UserId != viewDefinition.UserId || existing.Tenant != viewDefinition.Tenant {
return helper.QueryResult{Error: errors.New("user ID or tenant name mismatch")}
}
// Update the record
// Map the fields you want to allow updating, excluding UserId and TenantName
updateData := map[string]interface{}{
"table_name": viewDefinition.Name,
"position": viewDefinition.Order,
"icon": viewDefinition.Icon,
"filters": viewDefinition.Filters,
"sorting": viewDefinition.Sorting,
"columns": viewDefinition.ColumnsJson,
"updated_at": utils.Now(),
}
err = t.gormDb.Model(&existing).Updates(updateData).Error
if err != nil {
return helper.QueryResult{Error: err}
}
return helper.QueryResult{Result: existing}
}