Skip to content

Commit c86ed20

Browse files
persistent data storage is added
1 parent 6da2156 commit c86ed20

File tree

10 files changed

+762
-79
lines changed

10 files changed

+762
-79
lines changed

package-lock.json

Lines changed: 622 additions & 26 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
"@nestjs/serve-static": "^1.0.1",
2727
"@nestjs/websockets": "^6.9.0",
2828
"@puzzle-js/sentry-ui": "0.0.5",
29+
"@types/couchbase": "^2.4.1",
30+
"couchbase": "^2.6.9",
31+
"ottoman": "^1.0.6",
2932
"reflect-metadata": "^0.1.12",
3033
"rimraf": "^2.6.2",
3134
"rxjs": "^6.3.3",

src/app.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import { GatewayModule } from './gateway/gateway.module';
33
import { PageModule } from './page/page.module';
44
import { FragmentModule } from './fragment/fragment.module';
55
import { ServeStaticModule } from '@nestjs/serve-static';
6-
import { join, dirname } from 'path';
6+
import { dirname } from 'path';
7+
import { CouchbaseModule } from './couchbase/couchbase.module';
78

89
const sentryUi = dirname(require.resolve('@puzzle-js/sentry-ui'));
910

@@ -15,6 +16,7 @@ const sentryUi = dirname(require.resolve('@puzzle-js/sentry-ui'));
1516
GatewayModule,
1617
PageModule,
1718
FragmentModule,
19+
CouchbaseModule,
1820
],
1921
})
2022
export class AppModule { }

src/couchbase/couchbase.module.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { Module, Global } from '@nestjs/common';
2+
import { CouchbaseService } from './couchbase.service';
3+
4+
@Global()
5+
@Module({
6+
providers: [CouchbaseService],
7+
exports: [CouchbaseService],
8+
})
9+
export class CouchbaseModule {}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { CouchbaseService } from './couchbase.service';
3+
4+
describe('CouchbaseService', () => {
5+
let service: CouchbaseService;
6+
7+
beforeEach(async () => {
8+
const module: TestingModule = await Test.createTestingModule({
9+
providers: [CouchbaseService],
10+
}).compile();
11+
12+
service = module.get<CouchbaseService>(CouchbaseService);
13+
});
14+
15+
it('should be defined', () => {
16+
expect(service).toBeDefined();
17+
});
18+
});

src/couchbase/couchbase.service.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { Injectable } from '@nestjs/common';
2+
import { Cluster } from 'couchbase';
3+
4+
@Injectable()
5+
export class CouchbaseService {
6+
cluster: any;
7+
bucket: any;
8+
constructor() {
9+
this.cluster = new Cluster(process.env.COUCHBASE_URL);
10+
this.cluster.authenticate(process.env.COUCHBASE_USERNAME, process.env.COUCHBASE_PASSWORD);
11+
this.bucket = this.cluster.openBucket(process.env.COUCHBASE_BUCKET);
12+
}
13+
14+
getBucket() {
15+
return this.bucket;
16+
}
17+
}

src/gateway/gateway.gateway.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,38 +12,38 @@ export class GatewayGateway implements OnGatewayInit, OnGatewayConnection, OnGat
1212
@WebSocketServer() server: Server;
1313

1414
@SubscribeMessage('panel.gateways.get')
15-
getForPanel() {
16-
const gateways = this.gatewayService.get();
15+
async getForPanel() {
16+
const gateways = await this.gatewayService.get();
1717
return { event: 'panel.gateways', data: gateways };
1818
}
1919

2020
@SubscribeMessage('panel.gateways.delete')
21-
deleteForPanel(@MessageBody() name: string) {
22-
const deletionSuccessful = this.gatewayService.delete(name);
21+
async deleteForPanel(@MessageBody() name: string) {
22+
const deletionSuccessful = await this.gatewayService.delete(name);
2323
if (!deletionSuccessful) return;
24-
const gateways = this.gatewayService.get();
24+
const gateways = await this.gatewayService.get();
2525
this.server.emit('panel.gateways', gateways);
2626
this.server.emit('gateway.delete', name);
2727
}
2828

2929
@SubscribeMessage('panel.gateways.add')
30-
addForPanel(@MessageBody() gateway: Gateway) {
31-
this.gatewayService.add(gateway);
32-
this.server.emit('panel.gateways', this.gatewayService.get());
30+
async addForPanel(@MessageBody() gateway: Gateway) {
31+
await this.gatewayService.add(gateway);
32+
this.server.emit('panel.gateways', await this.gatewayService.get());
3333
this.server.emit('gateway.add', gateway);
3434
}
3535

3636
@SubscribeMessage('panel.gateways.update')
37-
updateForPanel(@MessageBody() gateway: Gateway) {
38-
const updateSuccessful = this.gatewayService.update(gateway);
37+
async updateForPanel(@MessageBody() gateway: Gateway) {
38+
const updateSuccessful = await this.gatewayService.update(gateway);
3939
if (!updateSuccessful) return;
40-
this.server.emit('panel.gateways', this.gatewayService.get());
40+
this.server.emit('panel.gateways', await this.gatewayService.get());
4141
this.server.emit('gateway.update', gateway);
4242
}
4343

4444
@SubscribeMessage('gateways.get')
45-
get() {
46-
const gateways = this.gatewayService.get();
45+
async get() {
46+
const gateways = await this.gatewayService.get();
4747
return { event: 'gateways', data: gateways };
4848
}
4949

src/gateway/gateway.service.ts

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,51 @@
11
import { Injectable } from '@nestjs/common';
22
import { Gateway } from './gateway.interface';
3+
import { CouchbaseService } from '../couchbase/couchbase.service';
4+
import { ViewQuery } from 'couchbase';
35

46
@Injectable()
57
export class GatewayService {
6-
private gateways: Gateway[] = [];
8+
constructor(private readonly couchbaseService: CouchbaseService) { }
79

810
add(gateway: Gateway) {
9-
this.gateways.push(gateway);
11+
return new Promise((resolve, reject) => {
12+
this.couchbaseService.getBucket().insert(`gateway_${gateway.name}`, {...gateway, type: 'gateway'}, (err, data) => {
13+
if (err) return reject(null);
14+
resolve(data);
15+
});
16+
});
1017
}
1118

1219
delete(name: string) {
13-
const gatewayToDelete = this.gateways.find(fr => fr.name === name);
14-
if (!gatewayToDelete) return false;
15-
const newgateways = this.gateways.filter(fr => fr.name === name);
16-
this.gateways = [...newgateways];
17-
return true;
20+
return new Promise((resolve, reject) => {
21+
this.couchbaseService.getBucket().remove(`gateway_${name}`, (err, data) => {
22+
if (err) return reject(null);
23+
resolve(data);
24+
});
25+
});
1826
}
1927

2028
update(gateway: Gateway) {
21-
const gatewayToUpdate = this.gateways.find(gw => gw.name === gateway.name);
22-
if (!gatewayToUpdate) return false;
23-
const newGateways = this.gateways.filter(gw => gw.name !== gatewayToUpdate.name);
24-
this.gateways = [...newGateways, gateway];
29+
return new Promise((resolve, reject) => {
30+
this.couchbaseService.getBucket().upsert(`gateway_${gateway.name}`, {...gateway, type: 'gateway'}, (err, data) => {
31+
if (err) return reject(null);
32+
resolve(data);
33+
});
34+
});
2535
}
2636

2737
get() {
28-
return this.gateways;
38+
return new Promise((resolve, reject) => {
39+
const query = ViewQuery
40+
.from('gateway', 'getAll')
41+
.stale(ViewQuery.Update.BEFORE);
42+
this.couchbaseService.getBucket().query(query, (err, data) => {
43+
console.log("err", err);
44+
console.log("data", data)
45+
if (err) return reject(null);
46+
const gateways = data.map((g) => g.value);
47+
resolve(gateways);
48+
});
49+
});
2950
}
3051
}

src/page/page.gateway.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,38 +12,38 @@ export class PageGateway implements OnGatewayInit, OnGatewayConnection, OnGatewa
1212
@WebSocketServer() server: Server;
1313

1414
@SubscribeMessage('panel.pages.get')
15-
getForPanel() {
16-
const pages = this.pageService.get();
15+
async getForPanel() {
16+
const pages = await this.pageService.get();
1717
return { event: 'panel.pages', data: pages };
1818
}
1919

2020
@SubscribeMessage('panel.pages.delete')
21-
deleteForPanel(@MessageBody() name: string) {
22-
const deletionSuccessful = this.pageService.delete(name);
21+
async deleteForPanel(@MessageBody() name: string) {
22+
const deletionSuccessful = await this.pageService.delete(name);
2323
if (!deletionSuccessful) return;
24-
const pages = this.pageService.get();
24+
const pages = await this.pageService.get();
2525
this.server.emit('panel.pages', pages);
2626
this.server.emit('page.delete', name);
2727
}
2828

2929
@SubscribeMessage('panel.pages.add')
30-
addForPanel(@MessageBody() page: Page) {
31-
this.pageService.add(page);
32-
this.server.emit('panel.pages', this.pageService.get());
30+
async addForPanel(@MessageBody() page: Page) {
31+
await this.pageService.add(page);
32+
this.server.emit('panel.pages', await this.pageService.get());
3333
this.server.emit('page.add', page);
3434
}
3535

3636
@SubscribeMessage('panel.pages.update')
37-
updateForPanel(@MessageBody() page: Page) {
38-
const updateSuccessful = this.pageService.update(page);
37+
async updateForPanel(@MessageBody() page: Page) {
38+
const updateSuccessful = await this.pageService.update(page);
3939
if (!updateSuccessful) return;
40-
this.server.emit('panel.pages', this.pageService.get());
40+
this.server.emit('panel.pages', await this.pageService.get());
4141
this.server.emit('page.update', page);
4242
}
4343

4444
@SubscribeMessage('pages.get')
45-
get() {
46-
const pages = this.pageService.get();
45+
async get() {
46+
const pages = await this.pageService.get();
4747
return { event: 'pages', data: pages };
4848
}
4949

src/page/page.service.ts

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,48 @@
11
import { Injectable } from '@nestjs/common';
2+
import { CouchbaseService } from '../couchbase/couchbase.service';
23
import { Page } from './page.interface';
3-
4+
import {ViewQuery} from 'couchbase';
45
@Injectable()
56
export class PageService {
6-
private pages: Page[] = [];
7+
constructor(private readonly couchbaseService: CouchbaseService) { }
78

89
add(page: Page) {
9-
this.pages.push(page);
10+
return new Promise((resolve, reject) => {
11+
this.couchbaseService.getBucket().insert(`page_${page.name}`, {...page, type: 'page'}, (err, data) => {
12+
if (err) return reject(null);
13+
resolve(data);
14+
});
15+
});
1016
}
1117

1218
delete(name: string) {
13-
const pageToDelete = this.pages.find(pg => pg.name === name);
14-
if (!pageToDelete) return false;
15-
const newpages = this.pages.filter(pg => pg.name === name);
16-
this.pages = [...newpages];
17-
return true;
19+
return new Promise((resolve, reject) => {
20+
this.couchbaseService.getBucket().remove(`page_${name}`, (err, data) => {
21+
if (err) return reject(null);
22+
resolve(data);
23+
});
24+
});
1825
}
1926

2027
update(page: Page) {
21-
const pageToUpdate = this.pages.find(pg => pg.name === page.name);
22-
if (!pageToUpdate) return false;
23-
const newpages = this.pages.filter(pg => pg.name !== pageToUpdate.name);
24-
this.pages = [...newpages, page ];
25-
return true;
28+
return new Promise((resolve, reject) => {
29+
this.couchbaseService.getBucket().upsert(`page_${page.name}`, { ...page, type: 'page' }, (err, data) => {
30+
if (err) return reject(null);
31+
resolve(data);
32+
});
33+
});
2634
}
2735

2836
get() {
29-
return this.pages;
37+
return new Promise((resolve, reject) => {
38+
const query = ViewQuery
39+
.from('page', 'getAll')
40+
.stale(ViewQuery.Update.BEFORE);
41+
this.couchbaseService.getBucket().query(query, (err, data) => {
42+
if (err) return reject(null);
43+
const pages = data.map((d) => d.value);
44+
resolve(pages);
45+
});
46+
});
3047
}
3148
}

0 commit comments

Comments
 (0)