@@ -18,23 +18,6 @@ function pushToMapped <K, V> (map: Map<K, V[]>, key: K, value: V): number {
18
18
return list . push ( value )
19
19
}
20
20
21
- function deleteFromMapped < K , V > ( map : Map < K , V [ ] > , key : K , value : V ) : boolean {
22
- const list = map . get ( key )
23
- if ( list === undefined ) {
24
- return false
25
- }
26
- const index = list . indexOf ( value )
27
- if ( index === - 1 ) {
28
- return false
29
- }
30
- if ( list . length === 1 ) {
31
- map . delete ( key )
32
- return true
33
- }
34
- list . splice ( index , 1 )
35
- return true
36
- }
37
-
38
21
export class Permissions {
39
22
readonly members = new States < MemberState > ( )
40
23
readonly requests = new States < RequestState > ( )
@@ -114,6 +97,15 @@ export class Permissions {
114
97
const amountMembers = this . members . byState . added ?. size ?? 0
115
98
// The signature of the member that created the request is not necessary
116
99
const neededSignatures = amountMembers - 1
100
+ if (
101
+ // Remove operations are okay with having one less
102
+ request . operation === 'remove' &&
103
+ // Two members can form a majority, to remove one of two members
104
+ // unilaterally is impossible
105
+ amountMembers > 2
106
+ ) {
107
+ return neededSignatures - 1
108
+ }
117
109
return neededSignatures
118
110
}
119
111
@@ -136,7 +128,19 @@ export class Permissions {
136
128
this . requests . set ( request . id , 'finished' )
137
129
this . openRequests . delete ( request . id )
138
130
this . signatures . delete ( request . id )
139
- deleteFromMapped ( this . openRequestsByMember , request . from , request )
131
+ const list = this . openRequestsByMember . get ( request . from )
132
+ if ( list === undefined ) {
133
+ throw new Error ( 'This may never occur' )
134
+ }
135
+ if ( list . shift ( ) !== request ) {
136
+ throw new Error ( 'This may also never occur' )
137
+ }
138
+ const entry = list [ 0 ]
139
+ if ( entry === undefined ) {
140
+ this . openRequestsByMember . delete ( request . from )
141
+ } else {
142
+ this . requests . set ( entry . id , 'active' )
143
+ }
140
144
return
141
145
}
142
146
throw new Error ( 'todo' )
0 commit comments