@into-cps-association/libms 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/.env +0 -3
  2. package/DEVELOPER.md +24 -7
  3. package/README.md +42 -43
  4. package/config/.env.default +6 -0
  5. package/config/http.json +30 -0
  6. package/dist/src/bootstrap.d.ts +1 -0
  7. package/dist/src/bootstrap.js +4 -0
  8. package/dist/src/bootstrap.js.map +1 -1
  9. package/dist/src/cloudcmd/cloudcmd.d.ts +3 -0
  10. package/dist/src/cloudcmd/cloudcmd.js +22 -0
  11. package/dist/src/cloudcmd/cloudcmd.js.map +1 -0
  12. package/dist/src/files/files.module.js +1 -7
  13. package/dist/src/files/files.module.js.map +1 -1
  14. package/dist/src/files/services/files-service.factory.d.ts +1 -3
  15. package/dist/src/files/services/files-service.factory.js +2 -10
  16. package/dist/src/files/services/files-service.factory.js.map +1 -1
  17. package/dist/src/files/services/local-files.service.js +2 -2
  18. package/dist/src/main.js +8 -8
  19. package/dist/src/main.js.map +1 -1
  20. package/dist/test/cloudcmd/cloudcmd.spec.js +35 -0
  21. package/dist/test/cloudcmd/cloudcmd.spec.js.map +1 -0
  22. package/dist/test/e2e/app.e2e.spec.js +27 -10
  23. package/dist/test/e2e/app.e2e.spec.js.map +1 -1
  24. package/dist/test/integration/files.service.integration.spec.js +1 -3
  25. package/dist/test/integration/files.service.integration.spec.js.map +1 -1
  26. package/dist/test/testUtil.js +1 -10
  27. package/dist/test/testUtil.js.map +1 -1
  28. package/dist/test/unit/files-service.factory.unit.spec.js +0 -8
  29. package/dist/test/unit/files-service.factory.unit.spec.js.map +1 -1
  30. package/dist/tsconfig.tsbuildinfo +1 -1
  31. package/package.json +37 -27
  32. package/pm2.config.js +10 -0
  33. package/src/bootstrap.ts +8 -0
  34. package/src/cloudcmd/cloudcmd.ts +32 -0
  35. package/src/files/files.module.ts +1 -7
  36. package/src/files/services/files-service.factory.ts +0 -5
  37. package/src/files/services/local-files.service.ts +2 -2
  38. package/src/main.ts +12 -7
  39. package/test/cloudcmd/cloudcmd.spec.ts +52 -0
  40. package/test/coverage/clover.xml +14 -19
  41. package/test/coverage/coverage-final.json +1 -1
  42. package/test/coverage/lcov-report/base.css +261 -123
  43. package/test/coverage/lcov-report/index.html +13 -13
  44. package/test/coverage/lcov-report/prettify.css +101 -1
  45. package/test/coverage/lcov-report/testUtil.ts.html +8 -35
  46. package/test/coverage/lcov.info +10 -19
  47. package/test/e2e/app.e2e.spec.ts +42 -42
  48. package/test/integration/files.service.integration.spec.ts +1 -3
  49. package/test/testUtil.ts +1 -10
  50. package/test/unit/files-service.factory.unit.spec.ts +0 -9
  51. package/tsconfig.json +1 -1
  52. package/dist/src/files/queries.d.ts +0 -2
  53. package/dist/src/files/queries.js +0 -47
  54. package/dist/src/files/queries.js.map +0 -1
  55. package/dist/src/files/services/gitlab-files.service.d.ts +0 -12
  56. package/dist/src/files/services/gitlab-files.service.js +0 -65
  57. package/dist/src/files/services/gitlab-files.service.js.map +0 -1
  58. package/dist/test/unit/gitlab-files.service.unit.spec.js +0 -37
  59. package/dist/test/unit/gitlab-files.service.unit.spec.js.map +0 -1
  60. package/src/files/queries.ts +0 -42
  61. package/src/files/services/gitlab-files.service.ts +0 -65
  62. package/test/starttraefik.bash +0 -11
  63. package/test/stoptraefik.bash +0 -9
  64. package/test/unit/gitlab-files.service.unit.spec.ts +0 -46
  65. /package/dist/test/{unit/gitlab-files.service.unit.spec.d.ts → cloudcmd/cloudcmd.spec.d.ts} +0 -0
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">58.06% </span>
26
+ <span class="strong">69.23% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>18/31</span>
28
+ <span class='fraction'>18/26</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/8</span>
35
+ <span class='fraction'>0/4</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">58.06% </span>
47
+ <span class="strong">69.23% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>18/31</span>
49
+ <span class='fraction'>18/26</span>
50
50
  </div>
51
51
 
52
52
 
@@ -244,16 +244,7 @@
244
244
  <a name='L179'></a><a href='#L179'>179</a>
245
245
  <a name='L180'></a><a href='#L180'>180</a>
246
246
  <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
247
+ <a name='L182'></a><a href='#L182'>182</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
257
248
  <span class="cline-any cline-yes">1x</span>
258
249
  <span class="cline-any cline-neutral">&nbsp;</span>
259
250
  <span class="cline-any cline-yes">1x</span>
@@ -316,15 +307,6 @@
316
307
  <span class="cline-any cline-no">&nbsp;</span>
317
308
  <span class="cline-any cline-neutral">&nbsp;</span>
318
309
  <span class="cline-any cline-no">&nbsp;</span>
319
- <span class="cline-any cline-neutral">&nbsp;</span>
320
- <span class="cline-any cline-no">&nbsp;</span>
321
- <span class="cline-any cline-neutral">&nbsp;</span>
322
- <span class="cline-any cline-no">&nbsp;</span>
323
- <span class="cline-any cline-neutral">&nbsp;</span>
324
- <span class="cline-any cline-no">&nbsp;</span>
325
- <span class="cline-any cline-no">&nbsp;</span>
326
- <span class="cline-any cline-neutral">&nbsp;</span>
327
- <span class="cline-any cline-no">&nbsp;</span>
328
310
  <span class="cline-any cline-no">&nbsp;</span>
329
311
  <span class="cline-any cline-neutral">&nbsp;</span>
330
312
  <span class="cline-any cline-no">&nbsp;</span>
@@ -502,18 +484,9 @@ export class MockConfigService {
502
484
  // eslint-disable-next-line class-methods-use-this
503
485
  <span class="fstat-no" title="function not covered" > get(</span>key: string): string {
504
486
  <span class="cstat-no" title="statement not covered" > switch (key) {</span>
505
- case 'TOKEN':
506
- <span class="cstat-no" title="statement not covered" > return process.env.TOKEN;</span>
507
487
  case 'LOCAL_PATH':
508
- <span class="cstat-no" title="statement not covered" > return process.env.TEST_PATH;</span>
509
- case 'GITLAB_URL':
510
- <span class="cstat-no" title="statement not covered" > return process.env.GITLAB_URL;</span>
511
- case 'GITLAB_GROUP':
512
- <span class="cstat-no" title="statement not covered" > return 'dtaas';</span>
488
+ <span class="cstat-no" title="statement not covered" > return process.env.LOCAL_PATH;</span>
513
489
  case 'MODE':
514
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (process.env.MODE === 'gitlab') {</span>
515
- <span class="cstat-no" title="statement not covered" > return 'gitlab';</span>
516
- }
517
490
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (process.env.MODE === 'local') {</span>
518
491
  <span class="cstat-no" title="statement not covered" > return 'local';</span>
519
492
  }
@@ -640,7 +613,7 @@ export const e2eReadFile = `query {
640
613
  <div class='footer quiet pad2 space-top1 center small'>
641
614
  Code coverage generated by
642
615
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
643
- at 2024-01-01T14:32:14.170Z
616
+ at 2024-01-24T15:14:58.796Z
644
617
  </div>
645
618
  <script src="prettify.js"></script>
646
619
  <script>
@@ -24,29 +24,20 @@ DA:56,1
24
24
  DA:59,0
25
25
  DA:61,0
26
26
  DA:63,0
27
- DA:65,0
28
- DA:67,0
27
+ DA:64,0
28
+ DA:66,0
29
29
  DA:69,0
30
- DA:70,0
31
- DA:72,0
32
- DA:73,0
33
- DA:75,0
34
- DA:78,0
35
- DA:83,1
36
- DA:102,1
37
- DA:142,1
38
- DA:160,1
39
- DA:178,1
40
- LF:31
30
+ DA:74,1
31
+ DA:93,1
32
+ DA:133,1
33
+ DA:151,1
34
+ DA:169,1
35
+ LF:26
41
36
  LH:18
42
37
  BRDA:59,0,0,0
43
38
  BRDA:59,0,1,0
44
39
  BRDA:59,0,2,0
45
- BRDA:59,0,3,0
46
- BRDA:59,0,4,0
47
- BRDA:59,0,5,0
48
- BRDA:69,1,0,0
49
- BRDA:72,2,0,0
50
- BRF:8
40
+ BRDA:63,1,0,0
41
+ BRF:4
51
42
  BRH:0
52
43
  end_of_record
@@ -1,7 +1,14 @@
1
1
  import { Test, TestingModule } from '@nestjs/testing';
2
2
  import { INestApplication } from '@nestjs/common';
3
3
  import * as request from 'supertest';
4
- // import { execSync } from "child_process";
4
+ import fetch from 'cross-fetch';
5
+ import {
6
+ ApolloClient,
7
+ DocumentNode,
8
+ HttpLink,
9
+ InMemoryCache,
10
+ gql,
11
+ } from '@apollo/client';
5
12
  import AppModule from '../../src/app.module';
6
13
  import {
7
14
  e2eReadFile,
@@ -10,12 +17,18 @@ import {
10
17
  expectedListDirectoryResponse,
11
18
  } from '../testUtil';
12
19
 
20
+ const client = new ApolloClient({
21
+ link: new HttpLink({
22
+ uri: `http://localhost:${process.env.PORT}${process.env.APOLLO_PATH}`,
23
+ fetch,
24
+ }),
25
+ cache: new InMemoryCache({ addTypename: false }),
26
+ });
27
+
13
28
  describe('End to End test for the application', () => {
14
29
  let app: INestApplication;
15
30
 
16
31
  beforeAll(async () => {
17
- // execSync("test/starttraefik.bash");
18
-
19
32
  const moduleFixture: TestingModule = await Test.createTestingModule({
20
33
  imports: [AppModule],
21
34
  }).compile();
@@ -28,52 +41,39 @@ describe('End to End test for the application', () => {
28
41
  }, 10000);
29
42
 
30
43
  afterAll(async () => {
31
- // execSync("test/stoptraefik.bash");
32
44
  await app.close();
33
45
  }, 10000);
34
46
 
35
- it('should return the filename corresponding to the directory given in the query', async () => {
36
- const query = e2elistDirectory;
37
-
38
- const response = await request('http://localhost:4001')
47
+ async function HTTPQuery(
48
+ query: string,
49
+ expectedResponse: unknown,
50
+ ): Promise<void> {
51
+ const response = await request(`http://localhost:${process.env.PORT}`)
39
52
  .post(process.env.APOLLO_PATH)
40
53
  .send({ query });
41
- expect(response.body).toEqual(expectedListDirectoryResponse);
42
- }, 10000);
43
-
44
- it('should return the content of a file given in the query ', async () => {
45
- const query = e2eReadFile;
54
+ expect(response.body).toEqual(expectedResponse);
55
+ }
46
56
 
47
- const response = await request('http://localhost:4001')
48
- .post(process.env.APOLLO_PATH)
49
- .send({ query });
50
- expect(response.body).toEqual(expectedFileContentResponse);
57
+ async function GraphQLQuery(
58
+ query: DocumentNode,
59
+ expectedResponse: unknown,
60
+ ): Promise<void> {
61
+ const { data } = await client.query({ query });
62
+ expect({ data }).toEqual(expectedResponse);
63
+ }
64
+ it('should return the directory contents requested with HTTP POST query', async () => {
65
+ await HTTPQuery(e2elistDirectory, expectedListDirectoryResponse);
51
66
  }, 10000);
52
- });
53
-
54
- /*
55
- describe("End to End test for the application", () => {
56
- it("should return the filename corresponding to the directory given in the query through the Traefik gateway", async () => {
57
- const query = e2elistDirectory;
58
-
59
- const response = await request("http://localhost")
60
- .post("/lib")
61
- .send({ query });
62
-
63
- response;
64
- expect(response.body).toEqual(expectedListDirectoryResponse);
65
- }, 10000);
66
67
 
67
- it("should return the content of a file given in the query through the Traefik gateway", async () => {
68
- const query = e2eReadFile;
68
+ it('should return the file content requested with HTTP POST query', async () => {
69
+ await HTTPQuery(e2eReadFile, expectedFileContentResponse);
70
+ }, 10000);
69
71
 
70
- const response = await request("http://localhost")
71
- .post("/lib")
72
- .send({ query });
72
+ it('should return the directory contents requested with GraphQL query', async () => {
73
+ await GraphQLQuery(gql(e2elistDirectory), expectedListDirectoryResponse);
74
+ }, 10000);
73
75
 
74
- response;
75
- expect(response.body).toEqual(expectedFileContentResponse);
76
- }, 10000);
77
- });
78
- }
79
- */
76
+ it('should return the file content requested with GraphQL query', async () => {
77
+ await GraphQLQuery(gql(e2eReadFile), expectedFileContentResponse);
78
+ }, 10000);
79
+ });
@@ -3,7 +3,6 @@ import { ConfigService } from '@nestjs/config';
3
3
  import FilesResolver from '../../src/files/resolvers/files.resolver';
4
4
  import FilesServiceFactory from '../../src/files/services/files-service.factory';
5
5
  import LocalFilesService from '../../src/files/services/local-files.service';
6
- import GitlabFilesService from '../../src/files/services/gitlab-files.service';
7
6
  import {
8
7
  pathToTestDirectory,
9
8
  pathToTestFileContent,
@@ -23,7 +22,6 @@ describe('Integration tests for FilesResolver', () => {
23
22
  FilesResolver,
24
23
  FilesServiceFactory,
25
24
  LocalFilesService,
26
- GitlabFilesService,
27
25
  { provide: ConfigService, useClass: MockConfigService },
28
26
  ],
29
27
  }).compile();
@@ -35,7 +33,7 @@ describe('Integration tests for FilesResolver', () => {
35
33
  jest.clearAllMocks();
36
34
  });
37
35
 
38
- const modes = ['local', 'gitlab'];
36
+ const modes = ['local'];
39
37
 
40
38
  // eslint-disable-next-line no-restricted-syntax
41
39
  for (const mode of modes) {
package/test/testUtil.ts CHANGED
@@ -57,18 +57,9 @@ export class MockConfigService {
57
57
  // eslint-disable-next-line class-methods-use-this
58
58
  get(key: string): string {
59
59
  switch (key) {
60
- case 'TOKEN':
61
- return process.env.TOKEN;
62
60
  case 'LOCAL_PATH':
63
- return process.env.TEST_PATH;
64
- case 'GITLAB_URL':
65
- return process.env.GITLAB_URL;
66
- case 'GITLAB_GROUP':
67
- return 'dtaas';
61
+ return process.env.LOCAL_PATH;
68
62
  case 'MODE':
69
- if (process.env.MODE === 'gitlab') {
70
- return 'gitlab';
71
- }
72
63
  if (process.env.MODE === 'local') {
73
64
  return 'local';
74
65
  }
@@ -3,25 +3,21 @@ import { Test, TestingModule } from '@nestjs/testing';
3
3
  import { ConfigService } from '@nestjs/config';
4
4
  import FilesServiceFactory from '../../src/files/services/files-service.factory';
5
5
  import LocalFilesService from '../../src/files/services/local-files.service';
6
- import GitlabFilesService from '../../src/files/services/gitlab-files.service';
7
6
  import { IFilesService } from '../../src/files/interfaces/files.service.interface';
8
7
 
9
8
  describe('FilesServiceFactory', () => {
10
9
  let serviceFactory: FilesServiceFactory;
11
10
  let configService: ConfigService;
12
11
  let localFilesService: IFilesService;
13
- let gitlabFilesService: IFilesService;
14
12
 
15
13
  beforeEach(async () => {
16
14
  localFilesService = new LocalFilesService(configService as ConfigService);
17
- gitlabFilesService = new GitlabFilesService(configService as ConfigService);
18
15
 
19
16
  const module: TestingModule = await Test.createTestingModule({
20
17
  providers: [
21
18
  FilesServiceFactory,
22
19
  { provide: ConfigService, useValue: { get: jest.fn() } },
23
20
  { provide: LocalFilesService, useValue: localFilesService },
24
- { provide: GitlabFilesService, useValue: gitlabFilesService },
25
21
  ],
26
22
  }).compile();
27
23
 
@@ -34,11 +30,6 @@ describe('FilesServiceFactory', () => {
34
30
  expect(serviceFactory.create()).toBe(localFilesService);
35
31
  });
36
32
 
37
- it('should create a gitlab files service when MODE is gitlab', () => {
38
- jest.spyOn(configService, 'get').mockReturnValue('gitlab');
39
- expect(serviceFactory.create()).toBe(gitlabFilesService);
40
- });
41
-
42
33
  it('should throw an error when MODE is invalid', () => {
43
34
  jest.spyOn(configService, 'get').mockReturnValue('invalid');
44
35
  expect(() => serviceFactory.create()).toThrowError(`Invalid MODE: invalid`);
package/tsconfig.json CHANGED
@@ -25,7 +25,7 @@
25
25
  "types": ["node", "jest"], //use node and jest types
26
26
  "typeRoots": [
27
27
  "node_modules/@types" //use node_modules/@types for type definitions
28
- ],
28
+ ]
29
29
  },
30
30
  "exclude": ["**/node_modules/*", "./dist"]
31
31
  }
@@ -1,2 +0,0 @@
1
- export declare const getDirectoryQuery: (domain: string, parsedPath: string) => string;
2
- export declare const getReadFileQuery: (domain: string, parsedPath: string) => string;
@@ -1,47 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getReadFileQuery = exports.getDirectoryQuery = void 0;
4
- const getDirectoryQuery = (domain, parsedPath) => `
5
- query listDirectory {
6
- project(fullPath: "${domain}") {
7
- repository {
8
- tree(path: "${parsedPath}", recursive: false) {
9
- blobs {
10
- edges {
11
- node {
12
- name
13
- type
14
- }
15
- }
16
- }
17
- trees {
18
- edges {
19
- node {
20
- name
21
- type
22
- }
23
- }
24
- }
25
- }
26
- }
27
- }
28
- }
29
- `;
30
- exports.getDirectoryQuery = getDirectoryQuery;
31
- const getReadFileQuery = (domain, parsedPath) => `
32
- query readFile {
33
- project(fullPath: "${domain}") {
34
- repository {
35
- blobs(paths: "${parsedPath}") {
36
- nodes {
37
- name
38
- rawBlob
39
- rawTextBlob
40
- }
41
- }
42
- }
43
- }
44
- }
45
- `;
46
- exports.getReadFileQuery = getReadFileQuery;
47
- //# sourceMappingURL=queries.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/files/queries.ts"],"names":[],"mappings":";;;AAAO,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAE,UAAkB,EAAE,EAAE,CAAC;;yBAEhD,MAAM;;sBAET,UAAU;;;;;;;;;;;;;;;;;;;;;CAqB/B,CAAC;AAzBW,QAAA,iBAAiB,qBAyB5B;AAEK,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAE,UAAkB,EAAE,EAAE,CAAC;;yBAE/C,MAAM;;wBAEP,UAAU;;;;;;;;;;CAUjC,CAAC;AAdW,QAAA,gBAAgB,oBAc3B"}
@@ -1,12 +0,0 @@
1
- import { ConfigService } from '@nestjs/config';
2
- import { Project } from 'src/types';
3
- import { IFilesService } from '../interfaces/files.service.interface';
4
- export default class GitlabFilesService implements IFilesService {
5
- private configService;
6
- constructor(configService: ConfigService);
7
- listDirectory(path: string): Promise<Project>;
8
- readFile(path: string): Promise<Project>;
9
- private parseArguments;
10
- private sendRequest;
11
- private executeQuery;
12
- }
@@ -1,65 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- const common_1 = require("@nestjs/common");
13
- const config_1 = require("@nestjs/config");
14
- const axios_1 = require("axios");
15
- const queries_1 = require("../queries");
16
- let GitlabFilesService = class GitlabFilesService {
17
- configService;
18
- constructor(configService) {
19
- this.configService = configService;
20
- }
21
- async listDirectory(path) {
22
- return this.executeQuery(path, queries_1.getDirectoryQuery);
23
- }
24
- async readFile(path) {
25
- return this.executeQuery(path, queries_1.getReadFileQuery);
26
- }
27
- async parseArguments(path) {
28
- const gitlabGroup = this.configService.get('GITLAB_GROUP');
29
- const pathParts = path.split('/');
30
- const project = pathParts[0];
31
- const domain = project === gitlabGroup ? project : `${gitlabGroup}/${project}`;
32
- const parsedPath = pathParts.slice(1).join('/');
33
- return { domain, parsedPath };
34
- }
35
- async sendRequest(query) {
36
- try {
37
- const response = await (0, axios_1.default)({
38
- url: 'https://gitlab.com/api/graphql',
39
- method: 'post',
40
- headers: {
41
- 'Content-Type': 'application/json',
42
- Authorization: `Bearer ${this.configService.get('GITLAB_TOKEN')}`,
43
- },
44
- data: {
45
- query,
46
- },
47
- });
48
- return response.data.data.project;
49
- }
50
- catch (error) {
51
- throw new Error('Invalid query');
52
- }
53
- }
54
- async executeQuery(path, getQuery) {
55
- const { domain, parsedPath } = await this.parseArguments(path);
56
- const query = getQuery(domain, parsedPath);
57
- return this.sendRequest(query);
58
- }
59
- };
60
- GitlabFilesService = __decorate([
61
- (0, common_1.Injectable)(),
62
- __metadata("design:paramtypes", [config_1.ConfigService])
63
- ], GitlabFilesService);
64
- exports.default = GitlabFilesService;
65
- //# sourceMappingURL=gitlab-files.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gitlab-files.service.js","sourceRoot":"","sources":["../../../../src/files/services/gitlab-files.service.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,2CAA4C;AAC5C,2CAA+C;AAC/C,iCAA0B;AAG1B,wCAAiE;AAKlD,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAEjB;IAApB,YAAoB,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAEpD,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,2BAAiB,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,0BAAgB,CAAC,CAAC;IACnD,CAAC;IAEO,KAAK,CAAC,cAAc,CAC1B,IAAY;QAEZ,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAa,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAW,SAAS,CAAC,CAAC,CAAC,CAAC;QAGrC,MAAM,MAAM,GACV,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,OAAO,EAAE,CAAC;QAElE,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAChC,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,KAAa;QACrC,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAA,eAAK,EAAC;gBAC3B,GAAG,EAAE,gCAAgC;gBACrC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE;iBAClE;gBACD,IAAI,EAAE;oBACJ,KAAK;iBACN;aACF,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;SACnC;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;SAClC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,IAAY,EACZ,QAAuB;QAEvB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;CACF,CAAA;AAtDoB,kBAAkB;IADtC,IAAA,mBAAU,GAAE;qCAGwB,sBAAa;GAF7B,kBAAkB,CAsDtC;kBAtDoB,kBAAkB"}
@@ -1,37 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const testing_1 = require("@nestjs/testing");
4
- const config_1 = require("@nestjs/config");
5
- const axios_1 = require("axios");
6
- const gitlab_files_service_1 = require("../../src/files/services/gitlab-files.service");
7
- const testUtil_1 = require("../testUtil");
8
- describe('GitlabFilesService', () => {
9
- let filesService;
10
- const mockConfigService = new testUtil_1.MockConfigService();
11
- jest.mock('axios');
12
- beforeEach(async () => {
13
- const module = await testing_1.Test.createTestingModule({
14
- providers: [
15
- gitlab_files_service_1.default,
16
- { provide: config_1.ConfigService, useValue: mockConfigService },
17
- ],
18
- })
19
- .overrideProvider(config_1.ConfigService)
20
- .useValue(mockConfigService)
21
- .compile();
22
- filesService = module.get(gitlab_files_service_1.default);
23
- });
24
- it('should list directory', async () => {
25
- jest.spyOn(axios_1.default, 'post').mockResolvedValue({ data: testUtil_1.testDirectory });
26
- const result = await filesService.listDirectory('user2');
27
- expect(result).toEqual(testUtil_1.testDirectory);
28
- });
29
- it('should read file', async () => {
30
- jest
31
- .spyOn(axios_1.default, 'post')
32
- .mockResolvedValue({ data: { data: testUtil_1.testFileContent } });
33
- const result = await filesService.readFile(testUtil_1.pathToTestFileContent);
34
- expect(result).toEqual(testUtil_1.testFileContent);
35
- });
36
- });
37
- //# sourceMappingURL=gitlab-files.service.unit.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gitlab-files.service.unit.spec.js","sourceRoot":"","sources":["../../../test/unit/gitlab-files.service.unit.spec.ts"],"names":[],"mappings":";;AAAA,6CAAsD;AACtD,2CAA+C;AAC/C,iCAA0B;AAC1B,wFAA+E;AAC/E,0CAKqB;AAErB,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,YAAgC,CAAC;IACrC,MAAM,iBAAiB,GAAG,IAAI,4BAAiB,EAAE,CAAC;IAClD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEnB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,MAAM,GAAkB,MAAM,cAAI,CAAC,mBAAmB,CAAC;YAC3D,SAAS,EAAE;gBACT,8BAAkB;gBAClB,EAAE,OAAO,EAAE,sBAAa,EAAE,QAAQ,EAAE,iBAAiB,EAAE;aACxD;SACF,CAAC;aACC,gBAAgB,CAAC,sBAAa,CAAC;aAC/B,QAAQ,CAAC,iBAAiB,CAAC;aAC3B,OAAO,EAAE,CAAC;QAEb,YAAY,GAAG,MAAM,CAAC,GAAG,CAAqB,8BAAkB,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,IAAI,CAAC,KAAK,CAAC,eAAK,EAAE,MAAM,CAAC,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,wBAAa,EAAE,CAAC,CAAC;QAErE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,wBAAa,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;QAChC,IAAI;aACD,KAAK,CAAC,eAAK,EAAE,MAAM,CAAC;aACpB,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,0BAAe,EAAE,EAAE,CAAC,CAAC;QAE1D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,gCAAqB,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,0BAAe,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,42 +0,0 @@
1
- export const getDirectoryQuery = (domain: string, parsedPath: string) => `
2
- query listDirectory {
3
- project(fullPath: "${domain}") {
4
- repository {
5
- tree(path: "${parsedPath}", recursive: false) {
6
- blobs {
7
- edges {
8
- node {
9
- name
10
- type
11
- }
12
- }
13
- }
14
- trees {
15
- edges {
16
- node {
17
- name
18
- type
19
- }
20
- }
21
- }
22
- }
23
- }
24
- }
25
- }
26
- `;
27
-
28
- export const getReadFileQuery = (domain: string, parsedPath: string) => `
29
- query readFile {
30
- project(fullPath: "${domain}") {
31
- repository {
32
- blobs(paths: "${parsedPath}") {
33
- nodes {
34
- name
35
- rawBlob
36
- rawTextBlob
37
- }
38
- }
39
- }
40
- }
41
- }
42
- `;
@@ -1,65 +0,0 @@
1
- import { Injectable } from '@nestjs/common';
2
- import { ConfigService } from '@nestjs/config';
3
- import axios from 'axios';
4
- import { Project } from 'src/types';
5
- import { IFilesService } from '../interfaces/files.service.interface';
6
- import { getDirectoryQuery, getReadFileQuery } from '../queries';
7
-
8
- type QueryFunction = (domain: string, parsedPath: string) => string;
9
-
10
- @Injectable()
11
- export default class GitlabFilesService implements IFilesService {
12
- // eslint-disable-next-line no-useless-constructor, no-empty-function
13
- constructor(private configService: ConfigService) {}
14
-
15
- async listDirectory(path: string): Promise<Project> {
16
- return this.executeQuery(path, getDirectoryQuery);
17
- }
18
-
19
- async readFile(path: string): Promise<Project> {
20
- return this.executeQuery(path, getReadFileQuery);
21
- }
22
-
23
- private async parseArguments(
24
- path: string,
25
- ): Promise<{ domain: string; parsedPath: string }> {
26
- const gitlabGroup = this.configService.get('GITLAB_GROUP');
27
- const pathParts: string[] = path.split('/');
28
- const project: string = pathParts[0];
29
-
30
- // Only prepend the gitlabGroup if it's not already part of the path
31
- const domain: string =
32
- project === gitlabGroup ? project : `${gitlabGroup}/${project}`;
33
-
34
- const parsedPath = pathParts.slice(1).join('/');
35
- return { domain, parsedPath };
36
- }
37
-
38
- private async sendRequest(query: string): Promise<Project> {
39
- try {
40
- const response = await axios({
41
- url: 'https://gitlab.com/api/graphql',
42
- method: 'post',
43
- headers: {
44
- 'Content-Type': 'application/json',
45
- Authorization: `Bearer ${this.configService.get('GITLAB_TOKEN')}`,
46
- },
47
- data: {
48
- query,
49
- },
50
- });
51
- return response.data.data.project;
52
- } catch (error) {
53
- throw new Error('Invalid query'); // Throw error instead of returning string
54
- }
55
- }
56
-
57
- private async executeQuery(
58
- path: string,
59
- getQuery: QueryFunction,
60
- ): Promise<Project> {
61
- const { domain, parsedPath } = await this.parseArguments(path);
62
- const query = getQuery(domain, parsedPath);
63
- return this.sendRequest(query);
64
- }
65
- }
@@ -1,11 +0,0 @@
1
- #!/bin/bash
2
-
3
- echo "Starting the Traefik gateway"
4
- cd ../../servers/config/gateway || exit 1
5
- docker run -d \
6
- --name "traefik-gateway" \
7
- --network=host -v "$PWD/traefik.yml":/etc/traefik/traefik.yml \
8
- -v "$PWD/dynamic":/etc/traefik/dynamic \
9
- -v /var/run/docker.sock:/var/run/docker.sock \
10
- --restart always \
11
- traefik:v2.10
@@ -1,9 +0,0 @@
1
- #!/bin/bash
2
-
3
- cd ../../servers/config/gateway || exit 1
4
-
5
- echo "Stopping the Traefik gateway"
6
- docker stop traefik-gateway
7
-
8
- echo "Removing the Traefik gateway container"
9
- docker rm traefik-gateway