/
system_intake_relation.go
188 lines (161 loc) · 6.58 KB
/
system_intake_relation.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
package resolvers
import (
"context"
"github.com/google/uuid"
"github.com/guregu/null/zero"
"github.com/jmoiron/sqlx"
"github.com/cmsgov/easi-app/pkg/graph/model"
"github.com/cmsgov/easi-app/pkg/models"
"github.com/cmsgov/easi-app/pkg/sqlutils"
"github.com/cmsgov/easi-app/pkg/storage"
)
// SetSystemIntakeRelationExistingService sets the relationship between a system intake and
// an existing service by setting a free-text contract/service name, clearing relationships between
// intakes and CEDAR systems, and setting any contract number relationships
func SetSystemIntakeRelationExistingService(
ctx context.Context,
store *storage.Store,
input *model.SetSystemIntakeRelationExistingServiceInput,
) (*models.SystemIntake, error) {
return sqlutils.WithTransactionRet[*models.SystemIntake](ctx, store, func(tx *sqlx.Tx) (*models.SystemIntake, error) {
// Fetch intake by ID
intake, err := store.FetchSystemIntakeByIDNP(ctx, tx, input.SystemIntakeID)
if err != nil {
return nil, err
}
// Set contract name
intake.ContractName = zero.StringFrom(input.ContractName)
relationType := models.RelationTypeExistingService
intake.SystemRelationType = &relationType
updatedIntake, err := store.UpdateSystemIntakeNP(ctx, tx, intake)
if err != nil {
return nil, err
}
// Remove CEDAR system relationships
if err := store.SetSystemIntakeSystems(ctx, tx, input.SystemIntakeID, []string{}); err != nil {
return nil, err
}
// Delete & recreate contract number relationships
// DISABLED: See Note [EASI-4160 Disable Contract Number Linking]
// if err := store.SetSystemIntakeContractNumbers(ctx, tx, input.SystemIntakeID, input.ContractNumbers); err != nil {
// return nil, err
// }
return updatedIntake, nil
})
}
// SetSystemIntakeRelationNewSystem effectively clears the relationship between a system intake
// and any previously set list of CEDAR Systems and contract/service names. It also
// sets any contract number relationships.
func SetSystemIntakeRelationNewSystem(
ctx context.Context,
store *storage.Store,
input *model.SetSystemIntakeRelationNewSystemInput,
) (*models.SystemIntake, error) {
return sqlutils.WithTransactionRet[*models.SystemIntake](ctx, store, func(tx *sqlx.Tx) (*models.SystemIntake, error) {
// Fetch intake by ID
intake, err := store.FetchSystemIntakeByIDNP(ctx, tx, input.SystemIntakeID)
if err != nil {
return nil, err
}
// Clear contract name
intake.ContractName = zero.StringFromPtr(nil)
relationType := models.RelationTypeNewSystem
intake.SystemRelationType = &relationType
updatedIntake, err := store.UpdateSystemIntakeNP(ctx, tx, intake)
if err != nil {
return nil, err
}
// Remove CEDAR system relationships
if err := store.SetSystemIntakeSystems(ctx, tx, input.SystemIntakeID, []string{}); err != nil {
return nil, err
}
// Delete & recreate contract number relationships
// DISABLED: See Note [EASI-4160 Disable Contract Number Linking]
// if err := store.SetSystemIntakeContractNumbers(ctx, tx, input.SystemIntakeID, input.ContractNumbers); err != nil {
// return nil, err
// }
return updatedIntake, nil
})
}
// SetSystemIntakeRelationExistingSystem sets the relationship between a system intake and
// a list of CEDAR Systems by setting an array of CEDAR System IDs, clearing any data about
// contract/service names, and setting any contract number relationships.
func SetSystemIntakeRelationExistingSystem(
ctx context.Context,
store *storage.Store,
getCedarSystem func(ctx context.Context, systemID string) (*models.CedarSystem, error),
input *model.SetSystemIntakeRelationExistingSystemInput,
) (*models.SystemIntake, error) {
return sqlutils.WithTransactionRet[*models.SystemIntake](ctx, store, func(tx *sqlx.Tx) (*models.SystemIntake, error) {
// Fetch intake by ID
intake, err := store.FetchSystemIntakeByIDNP(ctx, tx, input.SystemIntakeID)
if err != nil {
return nil, err
}
// Clear contract name
intake.ContractName = zero.StringFromPtr(nil)
relationType := models.RelationTypeExistingSystem
intake.SystemRelationType = &relationType
updatedIntake, err := store.UpdateSystemIntakeNP(ctx, tx, intake)
if err != nil {
return nil, err
}
// ensure all given CEDAR system IDs are valid by checking with CEDAR
for _, systemID := range input.CedarSystemIDs {
if _, err = getCedarSystem(ctx, systemID); err != nil {
return nil, err
}
}
// Add CEDAR system relationships
if err := store.SetSystemIntakeSystems(ctx, tx, input.SystemIntakeID, input.CedarSystemIDs); err != nil {
return nil, err
}
// Delete & recreate contract number relationships
// DISABLED: See Note [EASI-4160 Disable Contract Number Linking]
// if err := store.SetSystemIntakeContractNumbers(ctx, tx, input.SystemIntakeID, input.ContractNumbers); err != nil {
// return nil, err
// }
return updatedIntake, nil
})
}
// UnlinkSystemIntakeRelation clears all the relationship information on a system intake.
// This includes clearing the system relation type, contract name, contract number relationships, and CEDAR system relationships (TODO).
func UnlinkSystemIntakeRelation(
ctx context.Context,
store *storage.Store,
intakeID uuid.UUID,
) (*models.SystemIntake, error) {
return sqlutils.WithTransactionRet[*models.SystemIntake](ctx, store, func(tx *sqlx.Tx) (*models.SystemIntake, error) {
// Fetch intake by ID
intake, err := store.FetchSystemIntakeByIDNP(ctx, tx, intakeID)
if err != nil {
return nil, err
}
// Clear system relation type by setting to nil
intake.SystemRelationType = nil
// Clear contract name
intake.ContractName = zero.StringFromPtr(nil)
// Clear contract number relationships by setting an empty array of contract #'s
// declare this as an explicit empty slice instead of `nil`
// TODO: (Sam) update `SetSystemIntakeContractNumbers` to allow for `nil`
// DISABLED: See Note [EASI-4160 Disable Contract Number Linking]
// if err := store.SetSystemIntakeContractNumbers(ctx, tx, intakeID, []string{}); err != nil {
// return nil, err
// }
// Clear CEDAR system relationships
if err := store.SetSystemIntakeSystems(ctx, tx, intakeID, []string{}); err != nil {
return nil, err
}
// Update system intake
updatedIntake, err := store.UpdateSystemIntakeNP(ctx, tx, intake)
if err != nil {
return nil, err
}
return updatedIntake, nil
})
}
/*
Note [EASI-4160 Disable Contract Number Linking]
We have temporarily disabled contract number linking from the UI Linking page as it allows for submitted System Intakes to be edited. These
submitted System Intakes should be immutable, and the new linking functionality does not adhere to that.
*/