1
1
import fs from 'fs' ;
2
- import Datastore from '@seald-io/nedb'
2
+ import Datastore from '@seald-io/nedb' ;
3
3
import { Repo } from '../types' ;
4
4
5
+ const COMPACTION_INTERVAL = 1000 * 60 * 60 * 24 ; // once per day
6
+
7
+ // these don't get coverage in tests as they have already been run once before the test
8
+ /* istanbul ignore if */
5
9
if ( ! fs . existsSync ( './.data' ) ) fs . mkdirSync ( './.data' ) ;
10
+ /* istanbul ignore if */
6
11
if ( ! fs . existsSync ( './.data/db' ) ) fs . mkdirSync ( './.data/db' ) ;
7
12
8
13
const db = new Datastore ( { filename : './.data/db/repos.db' , autoload : true } ) ;
14
+ db . ensureIndex ( { fieldName : 'name' , unique : false } ) ;
15
+ db . setAutocompactionInterval ( COMPACTION_INTERVAL ) ;
16
+
17
+ const isBlank = ( str : string ) => {
18
+ return ! str || / ^ \s * $ / . test ( str ) ;
19
+ } ;
9
20
10
21
export const getRepos = async ( query : any = { } ) => {
22
+ if ( query ?. name ) {
23
+ query . name = query . name . toLowerCase ( ) ;
24
+ }
11
25
return new Promise < Repo [ ] > ( ( resolve , reject ) => {
12
- db . find ( { } , ( err : Error , docs : Repo [ ] ) => {
26
+ db . find ( query , ( err : Error , docs : Repo [ ] ) => {
27
+ // ignore for code coverage as neDB rarely returns errors even for an invalid query
28
+ /* istanbul ignore if */
13
29
if ( err ) {
14
30
reject ( err ) ;
15
31
} else {
@@ -21,7 +37,9 @@ export const getRepos = async (query: any = {}) => {
21
37
22
38
export const getRepo = async ( name : string ) => {
23
39
return new Promise < Repo | null > ( ( resolve , reject ) => {
24
- db . findOne ( { name } , ( err : Error | null , doc : Repo ) => {
40
+ db . findOne ( { name : name . toLowerCase ( ) } , ( err : Error | null , doc : Repo ) => {
41
+ // ignore for code coverage as neDB rarely returns errors even for an invalid query
42
+ /* istanbul ignore if */
25
43
if ( err ) {
26
44
reject ( err ) ;
27
45
} else {
@@ -31,15 +49,28 @@ export const getRepo = async (name: string) => {
31
49
} ) ;
32
50
} ;
33
51
34
-
35
52
export const createRepo = async ( repo : Repo ) => {
53
+ if ( isBlank ( repo . project ) ) {
54
+ throw new Error ( 'Project name cannot be empty' ) ;
55
+ }
56
+ if ( isBlank ( repo . name ) ) {
57
+ throw new Error ( 'Repository name cannot be empty' ) ;
58
+ } else {
59
+ repo . name = repo . name . toLowerCase ( ) ;
60
+ }
61
+ if ( isBlank ( repo . url ) ) {
62
+ throw new Error ( 'URL cannot be empty' ) ;
63
+ }
64
+
36
65
repo . users = {
37
66
canPush : [ ] ,
38
67
canAuthorise : [ ] ,
39
68
} ;
40
69
41
70
return new Promise < Repo > ( ( resolve , reject ) => {
42
71
db . insert ( repo , ( err , doc ) => {
72
+ // ignore for code coverage as neDB rarely returns errors even for an invalid query
73
+ /* istanbul ignore if */
43
74
if ( err ) {
44
75
reject ( err ) ;
45
76
} else {
@@ -50,6 +81,8 @@ export const createRepo = async (repo: Repo) => {
50
81
} ;
51
82
52
83
export const addUserCanPush = async ( name : string , user : string ) => {
84
+ name = name . toLowerCase ( ) ;
85
+ user = user . toLowerCase ( ) ;
53
86
return new Promise ( async ( resolve , reject ) => {
54
87
const repo = await getRepo ( name ) ;
55
88
if ( ! repo ) {
@@ -65,6 +98,8 @@ export const addUserCanPush = async (name: string, user: string) => {
65
98
66
99
const options = { multi : false , upsert : false } ;
67
100
db . update ( { name : name } , repo , options , ( err ) => {
101
+ // ignore for code coverage as neDB rarely returns errors even for an invalid query
102
+ /* istanbul ignore if */
68
103
if ( err ) {
69
104
reject ( err ) ;
70
105
} else {
@@ -75,6 +110,8 @@ export const addUserCanPush = async (name: string, user: string) => {
75
110
} ;
76
111
77
112
export const addUserCanAuthorise = async ( name : string , user : string ) => {
113
+ name = name . toLowerCase ( ) ;
114
+ user = user . toLowerCase ( ) ;
78
115
return new Promise ( async ( resolve , reject ) => {
79
116
const repo = await getRepo ( name ) ;
80
117
if ( ! repo ) {
@@ -91,6 +128,8 @@ export const addUserCanAuthorise = async (name: string, user: string) => {
91
128
92
129
const options = { multi : false , upsert : false } ;
93
130
db . update ( { name : name } , repo , options , ( err ) => {
131
+ // ignore for code coverage as neDB rarely returns errors even for an invalid query
132
+ /* istanbul ignore if */
94
133
if ( err ) {
95
134
reject ( err ) ;
96
135
} else {
@@ -101,6 +140,8 @@ export const addUserCanAuthorise = async (name: string, user: string) => {
101
140
} ;
102
141
103
142
export const removeUserCanAuthorise = async ( name : string , user : string ) => {
143
+ name = name . toLowerCase ( ) ;
144
+ user = user . toLowerCase ( ) ;
104
145
return new Promise ( async ( resolve , reject ) => {
105
146
const repo = await getRepo ( name ) ;
106
147
if ( ! repo ) {
@@ -112,6 +153,8 @@ export const removeUserCanAuthorise = async (name: string, user: string) => {
112
153
113
154
const options = { multi : false , upsert : false } ;
114
155
db . update ( { name : name } , repo , options , ( err ) => {
156
+ // ignore for code coverage as neDB rarely returns errors even for an invalid query
157
+ /* istanbul ignore if */
115
158
if ( err ) {
116
159
reject ( err ) ;
117
160
} else {
@@ -122,6 +165,8 @@ export const removeUserCanAuthorise = async (name: string, user: string) => {
122
165
} ;
123
166
124
167
export const removeUserCanPush = async ( name : string , user : string ) => {
168
+ name = name . toLowerCase ( ) ;
169
+ user = user . toLowerCase ( ) ;
125
170
return new Promise ( async ( resolve , reject ) => {
126
171
const repo = await getRepo ( name ) ;
127
172
if ( ! repo ) {
@@ -133,6 +178,8 @@ export const removeUserCanPush = async (name: string, user: string) => {
133
178
134
179
const options = { multi : false , upsert : false } ;
135
180
db . update ( { name : name } , repo , options , ( err ) => {
181
+ // ignore for code coverage as neDB rarely returns errors even for an invalid query
182
+ /* istanbul ignore if */
136
183
if ( err ) {
137
184
reject ( err ) ;
138
185
} else {
@@ -143,8 +190,11 @@ export const removeUserCanPush = async (name: string, user: string) => {
143
190
} ;
144
191
145
192
export const deleteRepo = async ( name : string ) => {
193
+ name = name . toLowerCase ( ) ;
146
194
return new Promise < void > ( ( resolve , reject ) => {
147
195
db . remove ( { name : name } , ( err ) => {
196
+ // ignore for code coverage as neDB rarely returns errors even for an invalid query
197
+ /* istanbul ignore if */
148
198
if ( err ) {
149
199
reject ( err ) ;
150
200
} else {
@@ -156,6 +206,7 @@ export const deleteRepo = async (name: string) => {
156
206
157
207
export const isUserPushAllowed = async ( name : string , user : string ) => {
158
208
name = name . toLowerCase ( ) ;
209
+ user = user . toLowerCase ( ) ;
159
210
return new Promise < boolean > ( async ( resolve ) => {
160
211
const repo = await getRepo ( name ) ;
161
212
if ( ! repo ) {
@@ -176,6 +227,7 @@ export const isUserPushAllowed = async (name: string, user: string) => {
176
227
177
228
export const canUserApproveRejectPushRepo = async ( name : string , user : string ) => {
178
229
name = name . toLowerCase ( ) ;
230
+ user = user . toLowerCase ( ) ;
179
231
console . log ( `checking if user ${ user } can approve/reject for ${ name } ` ) ;
180
232
return new Promise < boolean > ( async ( resolve ) => {
181
233
const repo = await getRepo ( name ) ;
0 commit comments