Skip to content

Commit ba34ee1

Browse files
committed
Introduce a flag for document actions to prompt user for reconfirmation
1 parent f8ba72d commit ba34ee1

File tree

6 files changed

+39
-31
lines changed

6 files changed

+39
-31
lines changed

access_context.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -766,7 +766,7 @@ func (_AccessContexts) UserPermissions(id AccessContextID, uid UserID) (map[DocT
766766
}
767767

768768
q := `
769-
SELECT acpv.doctype_id, acpv.docaction_id, dam.name
769+
SELECT acpv.doctype_id, acpv.docaction_id, dam.name, dam.reconfirm
770770
FROM wf_ac_perms_v acpv
771771
JOIN wf_docactions_master dam ON dam.id = acpv.docaction_id
772772
WHERE acpv.ac_id = ?
@@ -782,7 +782,7 @@ func (_AccessContexts) UserPermissions(id AccessContextID, uid UserID) (map[DocT
782782
for rows.Next() {
783783
var dtid int64
784784
var da DocAction
785-
err = rows.Scan(&dtid, &da.ID, &da.Name)
785+
err = rows.Scan(&dtid, &da.ID, &da.Name, &da.Reconfirm)
786786
if err != nil {
787787
return nil, err
788788
}
@@ -810,7 +810,7 @@ func (_AccessContexts) UserPermissionsByDocType(id AccessContextID, dtype DocTyp
810810
}
811811

812812
q := `
813-
SELECT acpv.docaction_id, dam.name
813+
SELECT acpv.docaction_id, dam.name, dam.reconfirm
814814
FROM wf_ac_perms_v acpv
815815
JOIN wf_docactions_master dam ON dam.id = acpv.docaction_id
816816
WHERE acpv.ac_id = ?
@@ -826,7 +826,7 @@ func (_AccessContexts) UserPermissionsByDocType(id AccessContextID, dtype DocTyp
826826
res := []DocAction{}
827827
for rows.Next() {
828828
var da DocAction
829-
err = rows.Scan(&da.ID, &da.Name)
829+
err = rows.Scan(&da.ID, &da.Name, &da.Reconfirm)
830830
if err != nil {
831831
return nil, err
832832
}
@@ -848,7 +848,7 @@ func (_AccessContexts) GroupPermissions(id AccessContextID, gid GroupID) (map[Do
848848
}
849849

850850
q := `
851-
SELECT acpv.doctype_id, acpv.docaction_id, dam.name
851+
SELECT acpv.doctype_id, acpv.docaction_id, dam.name, dam.reconfirm
852852
FROM wf_ac_perms_v acpv
853853
JOIN wf_docactions_master dam ON dam.id = acpv.docaction_id
854854
WHERE acpv.ac_id = ?
@@ -864,7 +864,7 @@ func (_AccessContexts) GroupPermissions(id AccessContextID, gid GroupID) (map[Do
864864
for rows.Next() {
865865
var dtid int64
866866
var da DocAction
867-
err = rows.Scan(&dtid, &da.ID, &da.Name)
867+
err = rows.Scan(&dtid, &da.ID, &da.Name, &da.Reconfirm)
868868
if err != nil {
869869
return nil, err
870870
}
@@ -892,7 +892,7 @@ func (_AccessContexts) GroupPermissionsByDocType(id AccessContextID, dtype DocTy
892892
}
893893

894894
q := `
895-
SELECT acpv.docaction_id, dam.name
895+
SELECT acpv.docaction_id, dam.name, dam.reconfirm
896896
FROM wf_ac_perms_v acpv
897897
JOIN wf_docactions_master dam ON dam.id = acpv.docaction_id
898898
WHERE acpv.ac_id = ?
@@ -908,7 +908,7 @@ func (_AccessContexts) GroupPermissionsByDocType(id AccessContextID, dtype DocTy
908908
res := []DocAction{}
909909
for rows.Next() {
910910
var da DocAction
911-
err = rows.Scan(&da.ID, &da.Name)
911+
err = rows.Scan(&da.ID, &da.Name, &da.Reconfirm)
912912
if err != nil {
913913
return nil, err
914914
}

docaction.go

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ type DocActionID int64
4242
//
4343
// N.B. All document actions must be defined as constant strings.
4444
type DocAction struct {
45-
ID DocActionID `json:"ID"` // Unique identifier of this action
46-
Name string `json:"Name"` // Globally-unique name of this action
45+
ID DocActionID `json:"ID"` // Unique identifier of this action
46+
Name string `json:"Name"` // Globally-unique name of this action
47+
Reconfirm bool `json:"Reconfirm"` // Should the user be prompted for a reconfirmation of this action?
4748
}
4849

4950
// Unexported type, only for convenience methods.
@@ -54,7 +55,7 @@ type _DocActions struct{}
5455
var DocActions _DocActions
5556

5657
// New creates and registers a new document action in the system.
57-
func (_DocActions) New(otx *sql.Tx, name string) (DocActionID, error) {
58+
func (_DocActions) New(otx *sql.Tx, name string, reconfirm bool) (DocActionID, error) {
5859
name = strings.TrimSpace(name)
5960
if name == "" {
6061
return 0, errors.New("document action cannot be empty")
@@ -71,7 +72,13 @@ func (_DocActions) New(otx *sql.Tx, name string) (DocActionID, error) {
7172
tx = otx
7273
}
7374

74-
res, err := tx.Exec("INSERT INTO wf_docactions_master(name) VALUES(?)", name)
75+
var res sql.Result
76+
var err error
77+
if reconfirm {
78+
res, err = tx.Exec("INSERT INTO wf_docactions_master(name, reconfirm) VALUES(?, ?)", name, 1)
79+
} else {
80+
res, err = tx.Exec("INSERT INTO wf_docactions_master(name, reconfirm) VALUES(?, ?)", name, 0)
81+
}
7582
if err != nil {
7683
return 0, err
7784
}
@@ -106,7 +113,7 @@ func (_DocActions) List(offset, limit int64) ([]*DocAction, error) {
106113
}
107114

108115
q := `
109-
SELECT *
116+
SELECT id, name, reconfirm
110117
FROM wf_docactions_master
111118
ORDER BY id
112119
LIMIT ? OFFSET ?
@@ -120,7 +127,7 @@ func (_DocActions) List(offset, limit int64) ([]*DocAction, error) {
120127
ary := make([]*DocAction, 0, 10)
121128
for rows.Next() {
122129
var elem DocAction
123-
err = rows.Scan(&elem.ID, &elem.Name)
130+
err = rows.Scan(&elem.ID, &elem.Name, &elem.Reconfirm)
124131
if err != nil {
125132
return nil, err
126133
}
@@ -140,8 +147,8 @@ func (_DocActions) Get(id DocActionID) (*DocAction, error) {
140147
}
141148

142149
var elem DocAction
143-
row := db.QueryRow("SELECT id, name FROM wf_docactions_master WHERE id = ?", id)
144-
err := row.Scan(&elem.ID, &elem.Name)
150+
row := db.QueryRow("SELECT id, name, reconfirm FROM wf_docactions_master WHERE id = ?", id)
151+
err := row.Scan(&elem.ID, &elem.Name, &elem.Reconfirm)
145152
if err != nil {
146153
return nil, err
147154
}
@@ -158,8 +165,8 @@ func (_DocActions) GetByName(name string) (*DocAction, error) {
158165
}
159166

160167
var elem DocAction
161-
row := db.QueryRow("SELECT id, name FROM wf_docactions_master WHERE name = ?", name)
162-
err := row.Scan(&elem.ID, &elem.Name)
168+
row := db.QueryRow("SELECT id, name, reconfirm FROM wf_docactions_master WHERE name = ?", name)
169+
err := row.Scan(&elem.ID, &elem.Name, &elem.Reconfirm)
163170
if err != nil {
164171
return nil, err
165172
}

doctype.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ type TransitionMap struct {
255255
// document currently in the given state can transition.
256256
func (_DocTypes) Transitions(dtype DocTypeID, from DocStateID) (map[DocStateID]*TransitionMap, error) {
257257
q := `
258-
SELECT dst.from_state_id, dsm1.name, dst.docaction_id, dam.name, dst.to_state_id, dsm2.name
258+
SELECT dst.from_state_id, dsm1.name, dst.docaction_id, dam.name, dam.reconfirm, dst.to_state_id, dsm2.name
259259
FROM wf_docstate_transitions dst
260260
JOIN wf_docstates_master dsm1 ON dsm1.id = dst.from_state_id
261261
JOIN wf_docstates_master dsm2 ON dsm2.id = dst.to_state_id
@@ -281,7 +281,7 @@ func (_DocTypes) Transitions(dtype DocTypeID, from DocStateID) (map[DocStateID]*
281281
for rows.Next() {
282282
var dsfrom DocState
283283
var t Transition
284-
err := rows.Scan(&dsfrom.ID, &dsfrom.Name, &t.Upon.ID, &t.Upon.Name, &t.To.ID, &t.To.Name)
284+
err := rows.Scan(&dsfrom.ID, &dsfrom.Name, &t.Upon.ID, &t.Upon.Name, &t.Upon.Reconfirm, &t.To.ID, &t.To.Name)
285285
if err != nil {
286286
return nil, err
287287
}

flow_test.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -127,15 +127,15 @@ func TestFlowCreate(t *testing.T) {
127127
tx := fatal1(db.Begin()).(*sql.Tx)
128128
defer tx.Rollback()
129129

130-
daID1 = fatal1(DocActions.New(tx, "Initialise")).(DocActionID)
131-
daID2 = fatal1(DocActions.New(tx, "New")).(DocActionID)
132-
daID3 = fatal1(DocActions.New(tx, "Get")).(DocActionID)
133-
daID4 = fatal1(DocActions.New(tx, "Update")).(DocActionID)
134-
daID5 = fatal1(DocActions.New(tx, "Delete")).(DocActionID)
135-
daID6 = fatal1(DocActions.New(tx, "Approve")).(DocActionID)
136-
daID7 = fatal1(DocActions.New(tx, "Reject")).(DocActionID)
137-
daID8 = fatal1(DocActions.New(tx, "Return")).(DocActionID)
138-
daID9 = fatal1(DocActions.New(tx, "Discard")).(DocActionID)
130+
daID1 = fatal1(DocActions.New(tx, "Initialise", false)).(DocActionID)
131+
daID2 = fatal1(DocActions.New(tx, "New", false)).(DocActionID)
132+
daID3 = fatal1(DocActions.New(tx, "Get", false)).(DocActionID)
133+
daID4 = fatal1(DocActions.New(tx, "Update", true)).(DocActionID)
134+
daID5 = fatal1(DocActions.New(tx, "Delete", true)).(DocActionID)
135+
daID6 = fatal1(DocActions.New(tx, "Approve", false)).(DocActionID)
136+
daID7 = fatal1(DocActions.New(tx, "Reject", false)).(DocActionID)
137+
daID8 = fatal1(DocActions.New(tx, "Return", false)).(DocActionID)
138+
daID9 = fatal1(DocActions.New(tx, "Discard", true)).(DocActionID)
139139

140140
fatal0(tx.Commit())
141141
})

role.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ func (_Roles) Permissions(rid RoleID) (map[string]struct {
312312
Actions []*DocAction
313313
}, error) {
314314
q := `
315-
SELECT dtm.id, dtm.name, dam.id, dam.name
315+
SELECT dtm.id, dtm.name, dam.id, dam.name, dam.reconfirm
316316
FROM wf_doctypes_master dtm
317317
JOIN wf_role_docactions rdas ON dtm.id = rdas.doctype_id
318318
JOIN wf_docactions_master dam ON dam.id = rdas.docaction_id
@@ -331,7 +331,7 @@ func (_Roles) Permissions(rid RoleID) (map[string]struct {
331331
for rows.Next() {
332332
var dt DocType
333333
var da DocAction
334-
err = rows.Scan(&dt.ID, &dt.Name, &da.ID, &da.Name)
334+
err = rows.Scan(&dt.ID, &dt.Name, &da.ID, &da.Name, &da.Reconfirm)
335335
if err != nil {
336336
return nil, err
337337
}

sql/wf_docactions_master.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ DROP TABLE IF EXISTS wf_docactions_master;
55
CREATE TABLE wf_docactions_master (
66
id INT NOT NULL AUTO_INCREMENT,
77
name VARCHAR(100) NOT NULL,
8+
reconfirm TINYINT(1) NOT NULL,
89
PRIMARY KEY (id),
910
UNIQUE (name)
1011
);

0 commit comments

Comments
 (0)