Migrated all simplex entities to simplexdb
This commit is contained in:
parent
c13f0a2905
commit
1a36b51266
|
@ -1,6 +1,6 @@
|
|||
version: "3"
|
||||
services:
|
||||
database:
|
||||
radiusdb:
|
||||
image: "mariadb:latest"
|
||||
volumes:
|
||||
- ./db:/var/lib/mysql
|
||||
|
@ -12,3 +12,14 @@ services:
|
|||
MYSQL_PASSWORD: radius
|
||||
ports:
|
||||
- 3306:3306
|
||||
simplexdb:
|
||||
image: postgres:latest
|
||||
volumes:
|
||||
- ./simplexdb:/var/lib/postgresql/data
|
||||
- ./dumpsimplex:/docker-entrypoint-initdb.d
|
||||
environment:
|
||||
POSTGRES_DB: simplex
|
||||
POSTGRES_USER: simplex
|
||||
POSTGRES_PASSWORD: simplex
|
||||
ports:
|
||||
- 5432:5432
|
||||
|
|
128
dump/radius.sql
128
dump/radius.sql
File diff suppressed because one or more lines are too long
0
dumpsimplex/dump.sql
Normal file
0
dumpsimplex/dump.sql
Normal file
1
dumpsimplex/simplex.sql
Normal file
1
dumpsimplex/simplex.sql
Normal file
|
@ -0,0 +1 @@
|
|||
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
250
package-lock.json
generated
250
package-lock.json
generated
|
@ -1332,6 +1332,11 @@
|
|||
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
|
||||
"dev": true
|
||||
},
|
||||
"buffer-writer": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
|
||||
"integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw=="
|
||||
},
|
||||
"bytes": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
|
||||
|
@ -3299,6 +3304,145 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"loopback-connector-postgresql": {
|
||||
"version": "3.9.1",
|
||||
"resolved": "https://registry.npmjs.org/loopback-connector-postgresql/-/loopback-connector-postgresql-3.9.1.tgz",
|
||||
"integrity": "sha512-shLmcZvbjKCuGNkF3i0xoycIe1VnvcPL4lh9VLc0r8c/7EpeSEmudtyauxOKCtgspbhtlJgAULE9ugUwykDMKQ==",
|
||||
"requires": {
|
||||
"async": "^0.9.0",
|
||||
"bluebird": "^3.4.6",
|
||||
"chalk": "^3.0.0",
|
||||
"debug": "^4.1.1",
|
||||
"loopback-connector": "^4.10.2",
|
||||
"pg": "^7.0.0",
|
||||
"strong-globalize": "^4.0.0",
|
||||
"uuid": "^3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"ansi-styles": {
|
||||
"version": "4.2.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
|
||||
"integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
|
||||
"requires": {
|
||||
"@types/color-name": "^1.1.1",
|
||||
"color-convert": "^2.0.1"
|
||||
}
|
||||
},
|
||||
"async": {
|
||||
"version": "0.9.2",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
|
||||
"integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0="
|
||||
},
|
||||
"chalk": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
|
||||
"integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
|
||||
"requires": {
|
||||
"ansi-styles": "^4.1.0",
|
||||
"supports-color": "^7.1.0"
|
||||
}
|
||||
},
|
||||
"color-convert": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||
"requires": {
|
||||
"color-name": "~1.1.4"
|
||||
}
|
||||
},
|
||||
"color-name": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
|
||||
},
|
||||
"has-flag": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
||||
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
|
||||
},
|
||||
"invert-kv": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.0.tgz",
|
||||
"integrity": "sha512-JzF8q2BeZA1ZkE3XROwRpoMQ9ObMgTtp0JH8EXewlbkikuOj2GPLIpUipdO+VL8QsTr2teAJD02EFGGL5cO7uw=="
|
||||
},
|
||||
"lcid": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz",
|
||||
"integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==",
|
||||
"requires": {
|
||||
"invert-kv": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"loopback-connector": {
|
||||
"version": "4.10.2",
|
||||
"resolved": "https://registry.npmjs.org/loopback-connector/-/loopback-connector-4.10.2.tgz",
|
||||
"integrity": "sha512-3aG0X6FtA9qAkD0FjPYYxt1HgBBezKHG7WMvl3cAt3KmvFAvEALsOZNZLoR1q49pUyc/W1VEJyQXEeHiWWTMuA==",
|
||||
"requires": {
|
||||
"async": "^3.1.0",
|
||||
"bluebird": "^3.4.6",
|
||||
"debug": "^4.1.1",
|
||||
"msgpack5": "^4.2.0",
|
||||
"strong-globalize": "^5.0.0",
|
||||
"uuid": "^3.0.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"async": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
|
||||
"integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw=="
|
||||
},
|
||||
"strong-globalize": {
|
||||
"version": "5.0.5",
|
||||
"resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-5.0.5.tgz",
|
||||
"integrity": "sha512-zv9jFoe2zAzJE/UyCvrQm1/FVfAARlR6pfDWvU0LEIpK1ri2E0Sco1ggALIhmzyPY/k0VWkdlx74DK/yq79h2Q==",
|
||||
"requires": {
|
||||
"accept-language": "^3.0.18",
|
||||
"debug": "^4.1.1",
|
||||
"globalize": "^1.4.2",
|
||||
"lodash": "^4.17.15",
|
||||
"md5": "^2.2.1",
|
||||
"mkdirp": "^1.0.3",
|
||||
"os-locale": "^4.0.0",
|
||||
"yamljs": "^0.3.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"mem": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz",
|
||||
"integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==",
|
||||
"requires": {
|
||||
"map-age-cleaner": "^0.1.3",
|
||||
"mimic-fn": "^2.1.0",
|
||||
"p-is-promise": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"mkdirp": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
|
||||
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
|
||||
},
|
||||
"os-locale": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-4.0.0.tgz",
|
||||
"integrity": "sha512-HsSR1+2l6as4Wp2SGZxqLnuFHxVvh1Ir9pvZxyujsC13egZVe7P0YeBLN0ijQzM/twrO5To3ia3jzBXAvpMTEA==",
|
||||
"requires": {
|
||||
"execa": "^1.0.0",
|
||||
"lcid": "^3.0.0",
|
||||
"mem": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"supports-color": {
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
|
||||
"integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
|
||||
"requires": {
|
||||
"has-flag": "^4.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"loopback-datasource-juggler": {
|
||||
"version": "4.19.2",
|
||||
"resolved": "https://registry.npmjs.org/loopback-datasource-juggler/-/loopback-datasource-juggler-4.19.2.tgz",
|
||||
|
@ -4310,6 +4454,11 @@
|
|||
"release-zalgo": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"packet-reader": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
|
||||
"integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
|
||||
},
|
||||
"param-case": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz",
|
||||
|
@ -4412,6 +4561,68 @@
|
|||
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
|
||||
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
|
||||
},
|
||||
"pg": {
|
||||
"version": "7.18.2",
|
||||
"resolved": "https://registry.npmjs.org/pg/-/pg-7.18.2.tgz",
|
||||
"integrity": "sha512-Mvt0dGYMwvEADNKy5PMQGlzPudKcKKzJds/VbOeZJpb6f/pI3mmoXX0JksPgI3l3JPP/2Apq7F36O63J7mgveA==",
|
||||
"requires": {
|
||||
"buffer-writer": "2.0.0",
|
||||
"packet-reader": "1.0.0",
|
||||
"pg-connection-string": "0.1.3",
|
||||
"pg-packet-stream": "^1.1.0",
|
||||
"pg-pool": "^2.0.10",
|
||||
"pg-types": "^2.1.0",
|
||||
"pgpass": "1.x",
|
||||
"semver": "4.3.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"semver": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz",
|
||||
"integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c="
|
||||
}
|
||||
}
|
||||
},
|
||||
"pg-connection-string": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz",
|
||||
"integrity": "sha1-2hhHsglA5C7hSSvq9l1J2RskXfc="
|
||||
},
|
||||
"pg-int8": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
|
||||
"integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="
|
||||
},
|
||||
"pg-packet-stream": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/pg-packet-stream/-/pg-packet-stream-1.1.0.tgz",
|
||||
"integrity": "sha512-kRBH0tDIW/8lfnnOyTwKD23ygJ/kexQVXZs7gEyBljw4FYqimZFxnMMx50ndZ8In77QgfGuItS5LLclC2TtjYg=="
|
||||
},
|
||||
"pg-pool": {
|
||||
"version": "2.0.10",
|
||||
"resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.10.tgz",
|
||||
"integrity": "sha512-qdwzY92bHf3nwzIUcj+zJ0Qo5lpG/YxchahxIN8+ZVmXqkahKXsnl2aiJPHLYN9o5mB/leG+Xh6XKxtP7e0sjg=="
|
||||
},
|
||||
"pg-types": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
|
||||
"integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
|
||||
"requires": {
|
||||
"pg-int8": "1.0.1",
|
||||
"postgres-array": "~2.0.0",
|
||||
"postgres-bytea": "~1.0.0",
|
||||
"postgres-date": "~1.0.4",
|
||||
"postgres-interval": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"pgpass": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz",
|
||||
"integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=",
|
||||
"requires": {
|
||||
"split": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"picomatch": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz",
|
||||
|
@ -4466,6 +4677,29 @@
|
|||
"semver-compare": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"postgres-array": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
|
||||
"integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="
|
||||
},
|
||||
"postgres-bytea": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
|
||||
"integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU="
|
||||
},
|
||||
"postgres-date": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.4.tgz",
|
||||
"integrity": "sha512-bESRvKVuTrjoBluEcpv2346+6kgB7UlnqWZsnbnCccTNq/pqfj1j6oBaN5+b/NrDXepYUT/HKadqv3iS9lJuVA=="
|
||||
},
|
||||
"postgres-interval": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
|
||||
"integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
|
||||
"requires": {
|
||||
"xtend": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"prelude-ls": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
|
||||
|
@ -5063,6 +5297,14 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"split": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
|
||||
"integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
|
||||
"requires": {
|
||||
"through": "2"
|
||||
}
|
||||
},
|
||||
"sprintf-js": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
|
||||
|
@ -5373,8 +5615,7 @@
|
|||
"through": {
|
||||
"version": "2.3.8",
|
||||
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
|
||||
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
|
||||
"dev": true
|
||||
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
|
||||
},
|
||||
"tmp": {
|
||||
"version": "0.0.33",
|
||||
|
@ -5669,6 +5910,11 @@
|
|||
"resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.3.tgz",
|
||||
"integrity": "sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ=="
|
||||
},
|
||||
"xtend": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
|
||||
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
|
||||
},
|
||||
"y18n": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
|
||||
|
|
|
@ -58,6 +58,7 @@
|
|||
"@types/minimist": "^1.2.0",
|
||||
"ip-cidr": "^2.0.8",
|
||||
"loopback-connector-mysql": "^5.4.2",
|
||||
"loopback-connector-postgresql": "^3.9.1",
|
||||
"minimist": "^1.2.5",
|
||||
"password-generator": "^2.2.3",
|
||||
"radius": "^1.1.4"
|
||||
|
|
4
src/__tests__/datasources/simplex.datasource.ts
Normal file
4
src/__tests__/datasources/simplex.datasource.ts
Normal file
|
@ -0,0 +1,4 @@
|
|||
import { SimplexDataSource } from "../../datasources";
|
||||
|
||||
|
||||
export const testSimplexDb: SimplexDataSource = new SimplexDataSource();
|
|
@ -12,18 +12,20 @@ import {
|
|||
UserinfoRepository
|
||||
} from '../../repositories';
|
||||
import { testdb } from '../datasources/radius.datasource';
|
||||
import { testSimplexDb } from '../datasources/simplex.datasource';
|
||||
|
||||
import { SubscriptionIds, Circuit, Userinfo, Radcheck, Radusergroup, Radreply } from '../../models';
|
||||
|
||||
export async function givenEmptyDatabase() {
|
||||
let subscriptionRepository: SubscriptionRepository;
|
||||
let circuitRepository: CircuitRepository;
|
||||
|
||||
subscriptionRepository = new SubscriptionRepository(testdb, async () => circuitRepository);
|
||||
circuitRepository = new CircuitRepository(testdb, async () => subscriptionRepository);
|
||||
subscriptionRepository = new SubscriptionRepository(testSimplexDb, async () => circuitRepository);
|
||||
circuitRepository = new CircuitRepository(testSimplexDb, async () => subscriptionRepository);
|
||||
|
||||
const subscriptonIdsRepository = new SubscriptionIdsRepository(testdb);
|
||||
const ipv4PoolRepository = new IPv4PoolRepository(testdb);
|
||||
const ipv6PoolRepository = new IPv6PoolRepository(testdb);
|
||||
const subscriptonIdsRepository = new SubscriptionIdsRepository(testSimplexDb);
|
||||
const ipv4PoolRepository = new IPv4PoolRepository(testSimplexDb);
|
||||
const ipv6PoolRepository = new IPv6PoolRepository(testSimplexDb);
|
||||
const radCheckRepository = new RadcheckRepository(testdb);
|
||||
const radGroupCheckRepository = new RadgroupcheckRepository(testdb);
|
||||
const radGroupReplyRepository = new RadgroupreplyRepository(testdb);
|
||||
|
@ -50,10 +52,10 @@ export async function givenEmptyDatabase() {
|
|||
export async function givenSubscription(id: number, firstname: string, lastname: string) {
|
||||
let subscriptionRepository: SubscriptionRepository;
|
||||
let circuitRepository: CircuitRepository;
|
||||
subscriptionRepository = new SubscriptionRepository(testdb, async () => circuitRepository);
|
||||
circuitRepository = new CircuitRepository(testdb, async () => subscriptionRepository);
|
||||
subscriptionRepository = new SubscriptionRepository(testSimplexDb, async () => circuitRepository);
|
||||
circuitRepository = new CircuitRepository(testSimplexDb, async () => subscriptionRepository);
|
||||
|
||||
const subscriptionIdsRepository = new SubscriptionIdsRepository(testdb);
|
||||
const subscriptionIdsRepository = new SubscriptionIdsRepository(testSimplexDb);
|
||||
|
||||
await subscriptionIdsRepository.create(new SubscriptionIds({
|
||||
id,
|
||||
|
@ -70,8 +72,8 @@ export async function givenSubscription(id: number, firstname: string, lastname:
|
|||
export async function givenCircuit(circuit: Partial<Circuit>) {
|
||||
let subscriptionRepository: SubscriptionRepository;
|
||||
let circuitRepository: CircuitRepository;
|
||||
subscriptionRepository = new SubscriptionRepository(testdb, async () => circuitRepository);
|
||||
circuitRepository = new CircuitRepository(testdb, async () => subscriptionRepository);
|
||||
subscriptionRepository = new SubscriptionRepository(testSimplexDb, async () => circuitRepository);
|
||||
circuitRepository = new CircuitRepository(testSimplexDb, async () => subscriptionRepository);
|
||||
|
||||
return circuitRepository.create(circuit);
|
||||
}
|
||||
|
@ -79,20 +81,20 @@ export async function givenCircuit(circuit: Partial<Circuit>) {
|
|||
export async function getSubscriptions() {
|
||||
let subscriptionRepository: SubscriptionRepository;
|
||||
let circuitRepository: CircuitRepository;
|
||||
subscriptionRepository = new SubscriptionRepository(testdb, async () => circuitRepository);
|
||||
circuitRepository = new CircuitRepository(testdb, async () => subscriptionRepository);
|
||||
subscriptionRepository = new SubscriptionRepository(testSimplexDb, async () => circuitRepository);
|
||||
circuitRepository = new CircuitRepository(testSimplexDb, async () => subscriptionRepository);
|
||||
|
||||
return subscriptionRepository.find();
|
||||
}
|
||||
|
||||
export async function givenSubscriptionIdsPool(pool: any) {
|
||||
const subscriptonIdsRepository = new SubscriptionIdsRepository(testdb);
|
||||
const subscriptonIdsRepository = new SubscriptionIdsRepository(testSimplexDb);
|
||||
|
||||
await subscriptonIdsRepository.createAll(pool);
|
||||
}
|
||||
|
||||
export async function getSubscriptionIdsPool() {
|
||||
const subscriptonIdsRepository = new SubscriptionIdsRepository(testdb);
|
||||
const subscriptonIdsRepository = new SubscriptionIdsRepository(testSimplexDb);
|
||||
|
||||
return subscriptonIdsRepository.find();
|
||||
}
|
||||
|
@ -100,20 +102,20 @@ export async function getSubscriptionIdsPool() {
|
|||
export async function getSubscriptionFromId(id: number) {
|
||||
let subscriptionRepository: SubscriptionRepository;
|
||||
let circuitRepository: CircuitRepository;
|
||||
subscriptionRepository = new SubscriptionRepository(testdb, async () => circuitRepository);
|
||||
circuitRepository = new CircuitRepository(testdb, async () => subscriptionRepository);
|
||||
subscriptionRepository = new SubscriptionRepository(testSimplexDb, async () => circuitRepository);
|
||||
circuitRepository = new CircuitRepository(testSimplexDb, async () => subscriptionRepository);
|
||||
|
||||
return subscriptionRepository.findById(id);
|
||||
}
|
||||
|
||||
export async function givenIPv4Pool(pool: any) {
|
||||
const ipv4PoolRepository = new IPv4PoolRepository(testdb);
|
||||
const ipv4PoolRepository = new IPv4PoolRepository(testSimplexDb);
|
||||
|
||||
await ipv4PoolRepository.createAll(pool);
|
||||
}
|
||||
|
||||
export async function givenIPv6Pool(pool: any) {
|
||||
const ipv6PoolRepository = new IPv6PoolRepository(testdb);
|
||||
const ipv6PoolRepository = new IPv6PoolRepository(testSimplexDb);
|
||||
|
||||
await ipv6PoolRepository.createAll(pool);
|
||||
}
|
||||
|
|
|
@ -1 +1,2 @@
|
|||
export * from './radius.datasource';
|
||||
export * from './simplex.datasource';
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "radius",
|
||||
"connector": "mysql",
|
||||
"host": "192.168.95.145",
|
||||
"host": "localhost",
|
||||
"port": 3306,
|
||||
"user": "radius",
|
||||
"password": "radius",
|
||||
|
|
10
src/datasources/simplex.datasource.config.json
Normal file
10
src/datasources/simplex.datasource.config.json
Normal file
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"name": "simplex",
|
||||
"connector": "postgresql",
|
||||
"url": "",
|
||||
"host": "localhost",
|
||||
"port": 5432,
|
||||
"user": "simplex",
|
||||
"password": "simplex",
|
||||
"database": "simplex"
|
||||
}
|
36
src/datasources/simplex.datasource.ts
Normal file
36
src/datasources/simplex.datasource.ts
Normal file
|
@ -0,0 +1,36 @@
|
|||
import {
|
||||
inject,
|
||||
lifeCycleObserver,
|
||||
LifeCycleObserver,
|
||||
ValueOrPromise,
|
||||
} from '@loopback/core';
|
||||
import {juggler} from '@loopback/repository';
|
||||
import config from './simplex.datasource.config.json';
|
||||
|
||||
@lifeCycleObserver('datasource')
|
||||
export class SimplexDataSource extends juggler.DataSource
|
||||
implements LifeCycleObserver {
|
||||
static dataSourceName = 'simplex';
|
||||
|
||||
constructor(
|
||||
@inject('datasources.config.simplex', {optional: true})
|
||||
dsConfig: object = config,
|
||||
) {
|
||||
super(dsConfig);
|
||||
}
|
||||
|
||||
/**
|
||||
* Start the datasource when application is started
|
||||
*/
|
||||
start(): ValueOrPromise<void> {
|
||||
// Add your logic here to be invoked when the application is started
|
||||
}
|
||||
|
||||
/**
|
||||
* Disconnect the datasource when application is stopped. This allows the
|
||||
* application to be shut down gracefully.
|
||||
*/
|
||||
stop(): ValueOrPromise<void> {
|
||||
return super.disconnect();
|
||||
}
|
||||
}
|
|
@ -7,7 +7,7 @@ export async function migrate(args: string[]) {
|
|||
const app = new ExoApiApplication();
|
||||
await app.boot();
|
||||
// We only add custom eXO models
|
||||
await app.migrateSchema({ existingSchema, models: ['SubscriptionIds', 'Circuit', 'Subscription', 'IPv4Pool', 'IPv6Pool'] });
|
||||
await app.migrateSchema({ existingSchema /*, models: ['SubscriptionIds', 'Circuit', 'Subscription', 'IPv4Pool', 'IPv6Pool']*/ });
|
||||
|
||||
// Connectors usually keep a pool of opened connections,
|
||||
// this keeps the process running even after all work is done.
|
||||
|
|
|
@ -3,13 +3,13 @@ import { Subscription, SubscriptionWithRelations } from './subscription.model';
|
|||
|
||||
@model({
|
||||
settings: {
|
||||
idInjection: false, mysql: { schema: 'radius', table: 'circuit' },
|
||||
idInjection: false, postgresql: { table: 'circuit' },
|
||||
foreignKeys: {
|
||||
fk_circuit_subscriptionId: {
|
||||
name: 'fk_circuit_subscriptionId',
|
||||
entity: 'Subscription',
|
||||
entityKey: 'id',
|
||||
foreignKey: 'subscriptionId',
|
||||
foreignKey: 'subscriptionid',
|
||||
},
|
||||
},
|
||||
}
|
||||
|
@ -20,20 +20,14 @@ export class Circuit extends Entity {
|
|||
type: Number,
|
||||
generated: true,
|
||||
require: true,
|
||||
precision: 10,
|
||||
scale: 0,
|
||||
id: 1,
|
||||
mysql: { "columnName": "id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
|
||||
})
|
||||
id: Number;
|
||||
|
||||
@property({
|
||||
type: Number,
|
||||
generated: true,
|
||||
generated: false,
|
||||
require: true,
|
||||
precision: 10,
|
||||
scale: 0,
|
||||
mysql: { "columnName": "circuitNum", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
|
||||
})
|
||||
circuitNum: Number;
|
||||
|
||||
|
@ -41,7 +35,7 @@ export class Circuit extends Entity {
|
|||
type: String,
|
||||
required: false,
|
||||
length: 128,
|
||||
mysql: { "columnName": "username", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "N" },
|
||||
postgresql: { "columnName": "username", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "N" },
|
||||
})
|
||||
username: String;
|
||||
|
||||
|
@ -49,7 +43,7 @@ export class Circuit extends Entity {
|
|||
type: String,
|
||||
required: false,
|
||||
length: 128,
|
||||
mysql: { "columnName": "password", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "N" },
|
||||
postgresql: { "columnName": "password", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "N" },
|
||||
})
|
||||
password: String;
|
||||
|
||||
|
@ -57,7 +51,7 @@ export class Circuit extends Entity {
|
|||
type: String,
|
||||
required: false,
|
||||
length: 15,
|
||||
mysql: { "columnName": "ipv4", "dataType": "varchar", "dataLength": 15, "dataPrecision": null, "dataScale": null, "nullable": "N" },
|
||||
postgresql: { "columnName": "ipv4", "dataType": "varchar", "dataLength": 15, "dataPrecision": null, "dataScale": null, "nullable": "N" },
|
||||
})
|
||||
ipv4: String;
|
||||
|
||||
|
@ -65,7 +59,7 @@ export class Circuit extends Entity {
|
|||
type: String,
|
||||
required: false,
|
||||
length: 15,
|
||||
mysql: { "columnName": "ipv6", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
|
||||
postgresql: { "columnName": "ipv6", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
|
||||
})
|
||||
ipv6: String;
|
||||
|
||||
|
@ -73,14 +67,14 @@ export class Circuit extends Entity {
|
|||
type: String,
|
||||
required: false,
|
||||
length: 128,
|
||||
mysql: { "columnName": "nasId", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "N" },
|
||||
postgresql: { "columnName": "nasId", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "N" },
|
||||
})
|
||||
nasId: String;
|
||||
|
||||
@property({
|
||||
type: Boolean,
|
||||
required: true,
|
||||
mysql: { "columnName": "hasManagement", "nullable": "N" },
|
||||
postgresql: { "columnName": "hasManagement", "nullable": "N" },
|
||||
default: false
|
||||
})
|
||||
hasManagement: boolean;
|
||||
|
@ -88,7 +82,7 @@ export class Circuit extends Entity {
|
|||
@property({
|
||||
type: Boolean,
|
||||
required: true,
|
||||
mysql: { "columnName": "isDisabled", "nullable": "N" },
|
||||
postgresql: { "columnName": "isDisabled", "nullable": "N" },
|
||||
default: false
|
||||
})
|
||||
isDisabled: boolean;
|
||||
|
|
|
@ -14,7 +14,7 @@ export class IPv4Pool extends Entity {
|
|||
type: Boolean,
|
||||
required: false,
|
||||
length: 1,
|
||||
mysql: { "columnName": "isAvailable", "nullable": "N" },
|
||||
postgresql: { "columnName": "isAvailable", "nullable": "N" },
|
||||
})
|
||||
isAvailable: boolean;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { Entity, model, property } from '@loopback/repository';
|
||||
|
||||
@model({ settings: { idInjection: false, mysql: { schema: 'radius', table: 'subscriptionids' } } })
|
||||
@model({ settings: { idInjection: false, postgresql: { table: 'subscriptionids' } } })
|
||||
export class SubscriptionIds extends Entity {
|
||||
@property({
|
||||
type: Number,
|
||||
|
@ -8,8 +8,7 @@ export class SubscriptionIds extends Entity {
|
|||
require: true,
|
||||
precision: 10,
|
||||
scale: 0,
|
||||
id: 1,
|
||||
mysql: { "columnName": "id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
|
||||
id: 1
|
||||
})
|
||||
id: Number;
|
||||
|
||||
|
@ -17,7 +16,7 @@ export class SubscriptionIds extends Entity {
|
|||
type: Boolean,
|
||||
required: false,
|
||||
length: 200,
|
||||
mysql: { "columnName": "isAvailable", "nullable": "N" },
|
||||
postgresql: { "columnName": "isAvailable", "nullable": "N" },
|
||||
})
|
||||
isAvailable: boolean;
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ import { Entity, model, property, hasMany } from '@loopback/repository';
|
|||
import { Circuit } from './circuit.model';
|
||||
|
||||
@model({
|
||||
settings: { idInjection: false, mysql: { schema: 'radius', table: 'subscription' } }
|
||||
settings: { idInjection: false, postgresql: { table: 'subscription' } }
|
||||
})
|
||||
export class Subscription extends Entity {
|
||||
|
||||
|
@ -13,7 +13,6 @@ export class Subscription extends Entity {
|
|||
precision: 10,
|
||||
scale: 0,
|
||||
id: 1,
|
||||
mysql: { "columnName": "id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
|
||||
})
|
||||
id: Number;
|
||||
|
||||
|
@ -21,7 +20,7 @@ export class Subscription extends Entity {
|
|||
type: String,
|
||||
required: true,
|
||||
length: 128,
|
||||
mysql: { "columnName": "firstname", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
|
||||
postgresql: { "columnName": "firstname", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
|
||||
})
|
||||
firstname: String;
|
||||
|
||||
|
@ -29,7 +28,7 @@ export class Subscription extends Entity {
|
|||
type: String,
|
||||
required: false,
|
||||
length: 128,
|
||||
mysql: { "columnName": "lastname", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
|
||||
postgresql: { "columnName": "lastname", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
|
||||
})
|
||||
lastname?: String;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { DefaultTransactionalRepository, BelongsToAccessor, repository } from '@loopback/repository';
|
||||
import { Circuit, CircuitRelations, Subscription } from '../models';
|
||||
import { RadiusDataSource } from '../datasources';
|
||||
import { SimplexDataSource } from '../datasources';
|
||||
import { inject, Getter } from '@loopback/core';
|
||||
import { SubscriptionRepository } from '.';
|
||||
|
||||
|
@ -14,7 +14,7 @@ export class CircuitRepository extends DefaultTransactionalRepository<
|
|||
typeof Circuit.prototype.id
|
||||
>;
|
||||
constructor(
|
||||
@inject('datasources.radius') dataSource: RadiusDataSource,
|
||||
@inject('datasources.simplex') dataSource: SimplexDataSource,
|
||||
@repository.getter('SubscriptionRepository')
|
||||
subscriptionRepositoryGetter: Getter<SubscriptionRepository>,
|
||||
) {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { DefaultTransactionalRepository } from '@loopback/repository';
|
||||
import { IPv4Pool, IPv4PoolRelations } from '../models';
|
||||
import { RadiusDataSource } from '../datasources';
|
||||
import { SimplexDataSource } from '../datasources';
|
||||
import { inject } from '@loopback/core';
|
||||
|
||||
export class IPv4PoolRepository extends DefaultTransactionalRepository<
|
||||
|
@ -9,7 +9,7 @@ export class IPv4PoolRepository extends DefaultTransactionalRepository<
|
|||
IPv4PoolRelations
|
||||
> {
|
||||
constructor(
|
||||
@inject('datasources.radius') dataSource: RadiusDataSource,
|
||||
@inject('datasources.simplex') dataSource: SimplexDataSource,
|
||||
) {
|
||||
super(IPv4Pool, dataSource);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { DefaultTransactionalRepository } from '@loopback/repository';
|
||||
import { IPv6Pool, IPv6PoolRelations } from '../models';
|
||||
import { RadiusDataSource } from '../datasources';
|
||||
import { SimplexDataSource } from '../datasources';
|
||||
import { inject } from '@loopback/core';
|
||||
|
||||
export class IPv6PoolRepository extends DefaultTransactionalRepository<
|
||||
|
@ -9,7 +9,7 @@ export class IPv6PoolRepository extends DefaultTransactionalRepository<
|
|||
IPv6PoolRelations
|
||||
> {
|
||||
constructor(
|
||||
@inject('datasources.radius') dataSource: RadiusDataSource,
|
||||
@inject('datasources.simplex') dataSource: SimplexDataSource,
|
||||
) {
|
||||
super(IPv6Pool, dataSource);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { DefaultTransactionalRepository } from '@loopback/repository';
|
||||
import { SubscriptionIds, SubscriptionIdsRelations } from '../models';
|
||||
import { RadiusDataSource } from '../datasources';
|
||||
import { SimplexDataSource } from '../datasources';
|
||||
import { inject } from '@loopback/core';
|
||||
|
||||
export class SubscriptionIdsRepository extends DefaultTransactionalRepository<
|
||||
|
@ -9,7 +9,7 @@ export class SubscriptionIdsRepository extends DefaultTransactionalRepository<
|
|||
SubscriptionIdsRelations
|
||||
> {
|
||||
constructor(
|
||||
@inject('datasources.radius') dataSource: RadiusDataSource,
|
||||
@inject('datasources.simplex') dataSource: SimplexDataSource,
|
||||
) {
|
||||
super(SubscriptionIds, dataSource);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { DefaultTransactionalRepository, HasManyRepositoryFactory, repository } from '@loopback/repository';
|
||||
import { Subscription, SubscriptionRelations, Circuit } from '../models';
|
||||
import { RadiusDataSource } from '../datasources';
|
||||
import { SimplexDataSource } from '../datasources';
|
||||
import { inject, Getter } from '@loopback/core';
|
||||
import { CircuitRepository } from './circuit.repository';
|
||||
|
||||
|
@ -14,7 +14,7 @@ export class SubscriptionRepository extends DefaultTransactionalRepository<
|
|||
typeof Subscription.prototype.id
|
||||
>;
|
||||
constructor(
|
||||
@inject('datasources.radius') dataSource: RadiusDataSource,
|
||||
@inject('datasources.simplex') dataSource: SimplexDataSource,
|
||||
@repository.getter('CircuitRepository')
|
||||
getCircuitRepository: Getter<CircuitRepository>,
|
||||
) {
|
||||
|
|
|
@ -20,10 +20,11 @@ import {
|
|||
import { RadiusDataSource } from "../datasources/radius.datasource";
|
||||
|
||||
const db: RadiusDataSource = new RadiusDataSource();
|
||||
const simplexDb: SimplexDataSource = new SimplexDataSource();
|
||||
|
||||
const subscriptonIdsRepository = new SubscriptionIdsRepository(db);
|
||||
const ipv4PoolRepository = new IPv4PoolRepository(db);
|
||||
const ipv6PoolRepository = new IPv6PoolRepository(db);
|
||||
const subscriptonIdsRepository = new SubscriptionIdsRepository(simplexDb);
|
||||
const ipv4PoolRepository = new IPv4PoolRepository(simplexDb);
|
||||
const ipv6PoolRepository = new IPv6PoolRepository(simplexDb);
|
||||
const radCheckRepository = new RadcheckRepository(db);
|
||||
const radGroupCheckRepository = new RadgroupcheckRepository(db);
|
||||
const radGroupReplyRepository = new RadgroupreplyRepository(db);
|
||||
|
@ -34,8 +35,8 @@ const userInfoRepository = new UserinfoRepository(db);
|
|||
|
||||
let subscriptionRepository: SubscriptionRepository;
|
||||
let circuitRepository: CircuitRepository;
|
||||
subscriptionRepository = new SubscriptionRepository(db, async () => circuitRepository);
|
||||
circuitRepository = new CircuitRepository(db, async () => subscriptionRepository);
|
||||
subscriptionRepository = new SubscriptionRepository(simplexDb, async () => circuitRepository);
|
||||
circuitRepository = new CircuitRepository(simplexDb, async () => subscriptionRepository);
|
||||
|
||||
// We attach simplex configuration file
|
||||
const simplexConfig: SimplexConfig = JSON.parse(
|
||||
|
@ -55,6 +56,7 @@ import {
|
|||
} from '../models';
|
||||
import minimist from 'minimist';
|
||||
import { SimplexConfig } from '../application';
|
||||
import { SimplexDataSource } from '../datasources';
|
||||
|
||||
async function checkAvailableIPsFromCircuit(fix?: boolean) {
|
||||
// Check for IPv4Pool
|
||||
|
|
|
@ -21,10 +21,11 @@ import {
|
|||
import { RadiusDataSource } from "../datasources/radius.datasource";
|
||||
|
||||
const db: RadiusDataSource = new RadiusDataSource();
|
||||
const simplexDb: SimplexDataSource = new SimplexDataSource();
|
||||
|
||||
const subscriptonIdsRepository = new SubscriptionIdsRepository(db);
|
||||
const ipv4PoolRepository = new IPv4PoolRepository(db);
|
||||
const ipv6PoolRepository = new IPv6PoolRepository(db);
|
||||
const subscriptonIdsRepository = new SubscriptionIdsRepository(simplexDb);
|
||||
const ipv4PoolRepository = new IPv4PoolRepository(simplexDb);
|
||||
const ipv6PoolRepository = new IPv6PoolRepository(simplexDb);
|
||||
const radCheckRepository = new RadcheckRepository(db);
|
||||
const radGroupCheckRepository = new RadgroupcheckRepository(db);
|
||||
const radGroupReplyRepository = new RadgroupreplyRepository(db);
|
||||
|
@ -35,8 +36,8 @@ const userInfoRepository = new UserinfoRepository(db);
|
|||
|
||||
let subscriptionRepository: SubscriptionRepository;
|
||||
let circuitRepository: CircuitRepository;
|
||||
subscriptionRepository = new SubscriptionRepository(db, async () => circuitRepository);
|
||||
circuitRepository = new CircuitRepository(db, async () => subscriptionRepository);
|
||||
subscriptionRepository = new SubscriptionRepository(simplexDb, async () => circuitRepository);
|
||||
circuitRepository = new CircuitRepository(simplexDb, async () => subscriptionRepository);
|
||||
|
||||
// We attach simplex configuration file
|
||||
const simplexConfig: SimplexConfig = JSON.parse(
|
||||
|
@ -57,6 +58,7 @@ import {
|
|||
import minimist from 'minimist';
|
||||
import { SimplexConfig } from '../application';
|
||||
import { IsolationLevel } from '@loopback/repository';
|
||||
import { SimplexDataSource } from '../datasources';
|
||||
|
||||
interface InitialSubsConf {
|
||||
min: number;
|
||||
|
|
Loading…
Reference in a new issue