/
system_intake_contract_number.go
92 lines (73 loc) · 3.07 KB
/
system_intake_contract_number.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
package storage
import (
"context"
"errors"
"github.com/google/uuid"
"github.com/jmoiron/sqlx"
"github.com/lib/pq"
"go.uber.org/zap"
"github.com/cmsgov/easi-app/pkg/appcontext"
"github.com/cmsgov/easi-app/pkg/models"
"github.com/cmsgov/easi-app/pkg/sqlqueries"
)
// SetSystemIntakeContractNumbers links given Contract Numbers to given System Intake ID
// This function opts to take a *sqlx.Tx instead of a NamedPreparer because the SQL calls inside this function are heavily intertwined, and we never want to call them outside the scope of a transaction
func (s *Store) SetSystemIntakeContractNumbers(ctx context.Context, tx *sqlx.Tx, systemIntakeID uuid.UUID, contractNumbers []string) error {
if systemIntakeID == uuid.Nil {
return errors.New("unexpected nil system intake ID when linking system intake to contract numbers")
}
if _, err := tx.NamedExec(sqlqueries.SystemIntakeContractNumberForm.Delete, map[string]interface{}{
"contract_numbers": pq.StringArray(contractNumbers),
"system_intake_id": systemIntakeID,
}); err != nil {
appcontext.ZLogger(ctx).Error("Failed to delete contract numbers linked to system intake", zap.Error(err))
return err
}
// no need to run insert if we are not inserting new contract numbers for this System Intake ID
if len(contractNumbers) < 1 {
return nil
}
userID := appcontext.Principal(ctx).Account().ID
setSystemIntakeContractNumbersLinks := make([]models.SystemIntakeContractNumber, len(contractNumbers))
for i, contractNumber := range contractNumbers {
contractNumberLink := models.NewSystemIntakeContractNumber(userID)
contractNumberLink.ID = uuid.New()
contractNumberLink.ModifiedBy = &userID
contractNumberLink.SystemIntakeID = systemIntakeID
contractNumberLink.ContractNumber = contractNumber
setSystemIntakeContractNumbersLinks[i] = contractNumberLink
}
if _, err := tx.NamedExec(sqlqueries.SystemIntakeContractNumberForm.Set, setSystemIntakeContractNumbersLinks); err != nil {
appcontext.ZLogger(ctx).Error("Failed to insert linked system intake to contract numbers", zap.Error(err))
return err
}
return nil
}
// SystemIntakeContractNumbersBySystemIntakeIDLOADER gets multiple groups of Contract Numbers by System Intake ID
func (s *Store) SystemIntakeContractNumbersBySystemIntakeIDLOADER(ctx context.Context, paramTableJSON string) (map[string][]*models.SystemIntakeContractNumber, error) {
stmt, err := s.db.PrepareNamed(sqlqueries.SystemIntakeContractNumberForm.SelectBySystemIntakeIDLOADER)
if err != nil {
return nil, err
}
defer stmt.Close()
var contracts []*models.SystemIntakeContractNumber
err = stmt.Select(&contracts, map[string]interface{}{
"param_table_json": paramTableJSON,
})
if err != nil {
return nil, err
}
ids, err := extractSystemIntakeIDs(paramTableJSON)
if err != nil {
return nil, err
}
store := map[string][]*models.SystemIntakeContractNumber{}
for _, id := range ids {
store[id] = []*models.SystemIntakeContractNumber{}
}
for _, contract := range contracts {
key := contract.SystemIntakeID.String()
store[key] = append(store[key], contract)
}
return store, nil
}