-
Notifications
You must be signed in to change notification settings - Fork 12
/
tag_repository.go
117 lines (103 loc) · 3.7 KB
/
tag_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
108
109
110
111
112
113
114
115
116
117
package repository
import (
"context"
"fmt"
"github.com/neo4j/neo4j-go-driver/v5/neo4j"
"github.com/neo4j/neo4j-go-driver/v5/neo4j/dbtype"
"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"
neo4jentity "github.com/openline-ai/openline-customer-os/packages/server/customer-os-neo4j-repository/entity"
"github.com/opentracing/opentracing-go"
)
type TagRepository interface {
Merge(ctx context.Context, tenant string, tag neo4jentity.TagEntity) (*dbtype.Node, error)
Update(ctx context.Context, tenant string, tag neo4jentity.TagEntity) (*dbtype.Node, error)
UnlinkAndDelete(ctx context.Context, tenant string, tagId string) error
}
type tagRepository struct {
driver *neo4j.DriverWithContext
}
func NewTagRepository(driver *neo4j.DriverWithContext) TagRepository {
return &tagRepository{
driver: driver,
}
}
func (r *tagRepository) Merge(ctx context.Context, tenant string, tag neo4jentity.TagEntity) (*dbtype.Node, error) {
span, ctx := opentracing.StartSpanFromContext(ctx, "TagRepository.Merge")
defer span.Finish()
tracing.SetDefaultNeo4jRepositorySpanTags(ctx, span)
session := utils.NewNeo4jWriteSession(ctx, *r.driver)
defer session.Close(ctx)
query := fmt.Sprintf(`MATCH (t:Tenant {name:$tenant})
MERGE (t)<-[:TAG_BELONGS_TO_TENANT]-(tag:Tag {name:$name})
ON CREATE SET
tag.id=randomUUID(),
tag.createdAt=$now,
tag.updatedAt=$now,
tag.source=$source,
tag.sourceOfTruth=$sourceOfTruth,
tag.appSource=$appSource,
tag:Tag_%s
RETURN tag`, tenant)
if result, err := session.ExecuteWrite(ctx, func(tx neo4j.ManagedTransaction) (any, error) {
queryResult, err := tx.Run(ctx, query,
map[string]any{
"tenant": tenant,
"name": tag.Name,
"source": tag.Source,
"sourceOfTruth": tag.SourceOfTruth,
"appSource": tag.AppSource,
"now": utils.Now(),
})
return utils.ExtractSingleRecordFirstValueAsNode(ctx, queryResult, err)
}); err != nil {
return nil, err
} else {
return result.(*dbtype.Node), nil
}
}
func (r *tagRepository) Update(ctx context.Context, tenant string, tag neo4jentity.TagEntity) (*dbtype.Node, error) {
span, ctx := opentracing.StartSpanFromContext(ctx, "TagRepository.Update")
defer span.Finish()
tracing.SetDefaultNeo4jRepositorySpanTags(ctx, span)
session := utils.NewNeo4jWriteSession(ctx, *r.driver)
defer session.Close(ctx)
if result, err := session.ExecuteWrite(ctx, func(tx neo4j.ManagedTransaction) (any, error) {
queryResult, err := tx.Run(ctx, `
MATCH (t:Tenant {name:$tenant})<-[:TAG_BELONGS_TO_TENANT]-(tag:Tag {id:$id})
SET tag.name=$name, tag.updatedAt=$now
RETURN tag`,
map[string]any{
"tenant": tenant,
"id": tag.Id,
"name": tag.Name,
"now": utils.Now(),
})
return utils.ExtractSingleRecordFirstValueAsNode(ctx, queryResult, err)
}); err != nil {
return nil, err
} else {
return result.(*dbtype.Node), nil
}
}
func (r *tagRepository) UnlinkAndDelete(ctx context.Context, tenant string, tagId string) error {
span, ctx := opentracing.StartSpanFromContext(ctx, "TagRepository.UnlinkAndDelete")
defer span.Finish()
tracing.SetDefaultNeo4jRepositorySpanTags(ctx, span)
session := utils.NewNeo4jWriteSession(ctx, *r.driver)
defer session.Close(ctx)
if _, err := session.ExecuteWrite(ctx, func(tx neo4j.ManagedTransaction) (any, error) {
_, err := tx.Run(ctx, `
MATCH (t:Tenant {name:$tenant})<-[:TAG_BELONGS_TO_TENANT]-(tag:Tag {id:$id})
DETACH DELETE tag`,
map[string]any{
"tenant": tenant,
"id": tagId,
})
return nil, err
}); err != nil {
return err
} else {
return nil
}
}