11import fs from 'fs' ;
2- import Datastore from '@seald-io/nedb'
2+ import Datastore from '@seald-io/nedb' ;
33import { Repo } from '../types' ;
44
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 */
59if ( ! fs . existsSync ( './.data' ) ) fs . mkdirSync ( './.data' ) ;
10+ /* istanbul ignore if */
611if ( ! fs . existsSync ( './.data/db' ) ) fs . mkdirSync ( './.data/db' ) ;
712
813const 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+ } ;
920
1021export const getRepos = async ( query : any = { } ) => {
22+ if ( query ?. name ) {
23+ query . name = query . name . toLowerCase ( ) ;
24+ }
1125 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 */
1329 if ( err ) {
1430 reject ( err ) ;
1531 } else {
@@ -21,7 +37,9 @@ export const getRepos = async (query: any = {}) => {
2137
2238export const getRepo = async ( name : string ) => {
2339 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 */
2543 if ( err ) {
2644 reject ( err ) ;
2745 } else {
@@ -31,15 +49,28 @@ export const getRepo = async (name: string) => {
3149 } ) ;
3250} ;
3351
34-
3552export 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+
3665 repo . users = {
3766 canPush : [ ] ,
3867 canAuthorise : [ ] ,
3968 } ;
4069
4170 return new Promise < Repo > ( ( resolve , reject ) => {
4271 db . insert ( repo , ( err , doc ) => {
72+ // ignore for code coverage as neDB rarely returns errors even for an invalid query
73+ /* istanbul ignore if */
4374 if ( err ) {
4475 reject ( err ) ;
4576 } else {
@@ -50,6 +81,8 @@ export const createRepo = async (repo: Repo) => {
5081} ;
5182
5283export const addUserCanPush = async ( name : string , user : string ) => {
84+ name = name . toLowerCase ( ) ;
85+ user = user . toLowerCase ( ) ;
5386 return new Promise ( async ( resolve , reject ) => {
5487 const repo = await getRepo ( name ) ;
5588 if ( ! repo ) {
@@ -65,6 +98,8 @@ export const addUserCanPush = async (name: string, user: string) => {
6598
6699 const options = { multi : false , upsert : false } ;
67100 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 */
68103 if ( err ) {
69104 reject ( err ) ;
70105 } else {
@@ -75,6 +110,8 @@ export const addUserCanPush = async (name: string, user: string) => {
75110} ;
76111
77112export const addUserCanAuthorise = async ( name : string , user : string ) => {
113+ name = name . toLowerCase ( ) ;
114+ user = user . toLowerCase ( ) ;
78115 return new Promise ( async ( resolve , reject ) => {
79116 const repo = await getRepo ( name ) ;
80117 if ( ! repo ) {
@@ -91,6 +128,8 @@ export const addUserCanAuthorise = async (name: string, user: string) => {
91128
92129 const options = { multi : false , upsert : false } ;
93130 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 */
94133 if ( err ) {
95134 reject ( err ) ;
96135 } else {
@@ -101,6 +140,8 @@ export const addUserCanAuthorise = async (name: string, user: string) => {
101140} ;
102141
103142export const removeUserCanAuthorise = async ( name : string , user : string ) => {
143+ name = name . toLowerCase ( ) ;
144+ user = user . toLowerCase ( ) ;
104145 return new Promise ( async ( resolve , reject ) => {
105146 const repo = await getRepo ( name ) ;
106147 if ( ! repo ) {
@@ -112,6 +153,8 @@ export const removeUserCanAuthorise = async (name: string, user: string) => {
112153
113154 const options = { multi : false , upsert : false } ;
114155 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 */
115158 if ( err ) {
116159 reject ( err ) ;
117160 } else {
@@ -122,6 +165,8 @@ export const removeUserCanAuthorise = async (name: string, user: string) => {
122165} ;
123166
124167export const removeUserCanPush = async ( name : string , user : string ) => {
168+ name = name . toLowerCase ( ) ;
169+ user = user . toLowerCase ( ) ;
125170 return new Promise ( async ( resolve , reject ) => {
126171 const repo = await getRepo ( name ) ;
127172 if ( ! repo ) {
@@ -133,6 +178,8 @@ export const removeUserCanPush = async (name: string, user: string) => {
133178
134179 const options = { multi : false , upsert : false } ;
135180 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 */
136183 if ( err ) {
137184 reject ( err ) ;
138185 } else {
@@ -143,8 +190,11 @@ export const removeUserCanPush = async (name: string, user: string) => {
143190} ;
144191
145192export const deleteRepo = async ( name : string ) => {
193+ name = name . toLowerCase ( ) ;
146194 return new Promise < void > ( ( resolve , reject ) => {
147195 db . remove ( { name : name } , ( err ) => {
196+ // ignore for code coverage as neDB rarely returns errors even for an invalid query
197+ /* istanbul ignore if */
148198 if ( err ) {
149199 reject ( err ) ;
150200 } else {
@@ -156,6 +206,7 @@ export const deleteRepo = async (name: string) => {
156206
157207export const isUserPushAllowed = async ( name : string , user : string ) => {
158208 name = name . toLowerCase ( ) ;
209+ user = user . toLowerCase ( ) ;
159210 return new Promise < boolean > ( async ( resolve ) => {
160211 const repo = await getRepo ( name ) ;
161212 if ( ! repo ) {
@@ -176,6 +227,7 @@ export const isUserPushAllowed = async (name: string, user: string) => {
176227
177228export const canUserApproveRejectPushRepo = async ( name : string , user : string ) => {
178229 name = name . toLowerCase ( ) ;
230+ user = user . toLowerCase ( ) ;
179231 console . log ( `checking if user ${ user } can approve/reject for ${ name } ` ) ;
180232 return new Promise < boolean > ( async ( resolve ) => {
181233 const repo = await getRepo ( name ) ;
0 commit comments