Initial commit

This commit is contained in:
Roger Garcia 2019-08-24 17:43:06 +02:00
commit 20a3893375
67 changed files with 7161 additions and 0 deletions

4
.dockerignore Normal file
View file

@ -0,0 +1,4 @@
node_modules
npm-debug.log
/dist

3
.eslintignore Normal file
View file

@ -0,0 +1,3 @@
node_modules/
dist/
coverage/

3
.eslintrc.js Normal file
View file

@ -0,0 +1,3 @@
module.exports = {
extends: '@loopback/eslint-config',
};

64
.gitignore vendored Normal file
View file

@ -0,0 +1,64 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Typescript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
# Transpiled JavaScript files from Typescript
/dist
# Cache used by TypeScript's incremental build
*.tsbuildinfo

4
.mocharc.json Normal file
View file

@ -0,0 +1,4 @@
{
"recursive": true,
"require": "source-map-support/register"
}

1
.npmrc Normal file
View file

@ -0,0 +1 @@
package-lock=true

2
.prettierignore Normal file
View file

@ -0,0 +1,2 @@
dist
*.json

6
.prettierrc Normal file
View file

@ -0,0 +1,6 @@
{
"bracketSpacing": false,
"singleQuote": true,
"printWidth": 80,
"trailingComma": "all"
}

18
.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,18 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceFolder}/index.js",
"preLaunchTask": "tsc: build - tsconfig.json",
"outFiles": [
"${workspaceFolder}/dist/**/*.js"
]
}
]
}

30
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,30 @@
{
"editor.rulers": [80],
"editor.tabCompletion": "on",
"editor.tabSize": 2,
"editor.trimAutoWhitespace": true,
"editor.formatOnSave": true,
"files.exclude": {
"**/.DS_Store": true,
"**/.git": true,
"**/.hg": true,
"**/.svn": true,
"**/CVS": true,
"dist": true,
},
"files.insertFinalNewline": true,
"files.trimTrailingWhitespace": true,
"typescript.tsdk": "./node_modules/typescript/lib",
"eslint.autoFixOnSave": true,
"eslint.run": "onSave",
"eslint.nodePath": "./node_modules",
"eslint.validate": [
"javascript",
{
"language": "typescript",
"autoFix": true
}
]
}

29
.vscode/tasks.json vendored Normal file
View file

@ -0,0 +1,29 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Watch and Compile Project",
"type": "shell",
"command": "npm",
"args": ["--silent", "run", "build:watch"],
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": "$tsc-watch"
},
{
"label": "Build, Test and Lint",
"type": "shell",
"command": "npm",
"args": ["--silent", "run", "test:dev"],
"group": {
"kind": "test",
"isDefault": true
},
"problemMatcher": ["$tsc", "$eslint-compact", "$eslint-stylish"]
}
]
}

1
.yo-rc.json Normal file
View file

@ -0,0 +1 @@
{}

36
DEVELOPING.md Normal file
View file

@ -0,0 +1,36 @@
# Developer's Guide
We use Visual Studio Code for developing LoopBack and recommend the same to our
users.
## VSCode setup
Install the following extensions:
- [eslint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
- [prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
## Development workflow
### Visual Studio Code
1. Start the build task (Cmd+Shift+B) to run TypeScript compiler in the
background, watching and recompiling files as you change them. Compilation
errors will be shown in the VSCode's "PROBLEMS" window.
2. Execute "Run Rest Task" from the Command Palette (Cmd+Shift+P) to re-run the
test suite and lint the code for both programming and style errors. Linting
errors will be shown in VSCode's "PROBLEMS" window. Failed tests are printed
to terminal output only.
### Other editors/IDEs
1. Open a new terminal window/tab and start the continous build process via
`npm run build:watch`. It will run TypeScript compiler in watch mode,
recompiling files as you change them. Any compilation errors will be printed
to the terminal.
2. In your main terminal window/tab, run `npm run test:dev` to re-run the test
suite and lint the code for both programming and style errors. You should run
this command manually whenever you have new changes to test. Test failures
and linter errors will be printed to the terminal.

28
Dockerfile Normal file
View file

@ -0,0 +1,28 @@
# Check out https://hub.docker.com/_/node to select a new base image
FROM node:10-slim
# Set to a non-root built-in user `node`
USER node
# Create app directory (with user `node`)
RUN mkdir -p /home/node/app
WORKDIR /home/node/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY --chown=node package*.json ./
RUN npm install
# Bundle app source code
COPY --chown=node . .
RUN npm run build
# Bind to all network interfaces so that it can be mapped to the host OS
ENV HOST=0.0.0.0 PORT=3000
EXPOSE ${PORT}
CMD [ "node", "." ]

3
README.md Normal file
View file

@ -0,0 +1,3 @@
# exo-api
[![LoopBack](https://github.com/strongloop/loopback-next/raw/master/docs/site/imgs/branding/Powered-by-LoopBack-Badge-(blue)-@2x.png)](http://loopback.io/)

21
index.js Normal file
View file

@ -0,0 +1,21 @@
const application = require('./dist');
module.exports = application;
if (require.main === module) {
// Run the application
const config = {
rest: {
port: +(process.env.PORT || 3000),
host: process.env.HOST,
openApiSpec: {
// useful when used with OASGraph to locate your application
setServersFromRequest: true,
},
},
};
application.main(config).catch(err => {
console.error('Cannot start the application.', err);
process.exit(1);
});
}

1
index.ts Normal file
View file

@ -0,0 +1 @@
export * from './src';

4749
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

72
package.json Normal file
View file

@ -0,0 +1,72 @@
{
"name": "exo-api",
"version": "1.0.0",
"description": "API Rest for eXO (associacio expansio xarxa oberta) an associative ISP",
"keywords": [
"loopback-application",
"loopback"
],
"main": "index.js",
"engines": {
"node": ">=8.9"
},
"scripts": {
"build": "lb-tsc",
"build:watch": "lb-tsc --watch",
"clean": "lb-clean dist *.tsbuildinfo",
"lint": "npm run prettier:check && npm run eslint",
"lint:fix": "npm run eslint:fix && npm run prettier:fix",
"prettier:cli": "lb-prettier \"**/*.ts\" \"**/*.js\"",
"prettier:check": "npm run prettier:cli -- -l",
"prettier:fix": "npm run prettier:cli -- --write",
"eslint": "lb-eslint --report-unused-disable-directives .",
"eslint:fix": "npm run eslint -- --fix",
"pretest": "npm run clean && npm run build",
"test": "lb-mocha --allow-console-logs \"dist/__tests__\"",
"posttest": "npm run lint",
"test:dev": "lb-mocha --allow-console-logs dist/__tests__/**/*.js && npm run posttest",
"docker:build": "docker build -t exo-api .",
"docker:run": "docker run -p 3000:3000 -d exo-api",
"migrate": "node ./dist/migrate",
"prestart": "npm run build",
"start": "node .",
"prepublishOnly": "npm run test"
},
"repository": {
"type": "git"
},
"author": "",
"license": "",
"files": [
"README.md",
"index.js",
"index.d.ts",
"dist",
"src",
"!*/__tests__"
],
"dependencies": {
"@loopback/boot": "^1.4.3",
"@loopback/context": "^1.20.1",
"@loopback/core": "^1.8.4",
"@loopback/openapi-v3": "^1.6.4",
"@loopback/repository": "^1.8.1",
"@loopback/rest": "^1.16.2",
"@loopback/rest-explorer": "^1.2.4",
"@loopback/service-proxy": "^1.2.4",
"loopback-connector-mysql": "^5.4.2"
},
"devDependencies": {
"@loopback/build": "^2.0.2",
"@loopback/testlab": "^1.6.2",
"@types/node": "^10.14.9",
"@typescript-eslint/parser": "^1.10.2",
"@typescript-eslint/eslint-plugin": "^1.10.2",
"@loopback/eslint-config": "^1.1.2",
"eslint": "^5.16.0",
"eslint-config-prettier": "^5.0.0",
"eslint-plugin-eslint-plugin": "^2.1.0",
"eslint-plugin-mocha": "^5.3.0",
"typescript": "~3.5.2"
}
}

73
public/index.html Normal file
View file

@ -0,0 +1,73 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>API Rest for eXO (associacio expansio xarxa oberta) an associative ISP</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="shortcut icon" type="image/x-icon" href="//v4.loopback.io/favicon.ico">
<style>
h3 {
margin-left: 25px;
text-align: center;
}
a, a:visited {
color: #3f5dff;
}
h3 a {
margin-left: 10px;
}
a:hover, a:focus, a:active {
color: #001956;
}
.power {
position: absolute;
bottom: 25px;
left: 50%;
transform: translateX(-50%);
}
.info {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%)
}
.info h1 {
text-align: center;
margin-bottom: 0;
}
.info p {
text-align: center;
margin-bottom: 3em;
margin-top: 1em;
}
</style>
</head>
<body>
<div class="info">
<h1>exo-api</h1>
<p>Version 1.0.0</p>
<h3>OpenAPI spec: <a href="/openapi.json">/openapi.json</a></h3>
<h3>API Explorer: <a href="/explorer">/explorer</a></h3>
</div>
<footer class="power">
<a href="https://v4.loopback.io" target="_blank">
<img src="https://loopback.io/images/branding/powered-by-loopback/blue/powered-by-loopback-sm.png" />
</a>
</footer>
</body>
</html>

3
src/__tests__/README.md Normal file
View file

@ -0,0 +1,3 @@
# Tests
Please place your tests in this folder.

View file

@ -0,0 +1,31 @@
import {Client} from '@loopback/testlab';
import {ExoApiApplication} from '../..';
import {setupApplication} from './test-helper';
describe('HomePage', () => {
let app: ExoApiApplication;
let client: Client;
before('setupApplication', async () => {
({app, client} = await setupApplication());
});
after(async () => {
await app.stop();
});
it('exposes a default home page', async () => {
await client
.get('/')
.expect(200)
.expect('Content-Type', /text\/html/);
});
it('exposes self-hosted explorer', async () => {
await client
.get('/explorer/')
.expect(200)
.expect('Content-Type', /text\/html/)
.expect(/<title>LoopBack API Explorer/);
});
});

View file

@ -0,0 +1,21 @@
import {Client, expect} from '@loopback/testlab';
import {ExoApiApplication} from '../..';
import {setupApplication} from './test-helper';
describe('PingController', () => {
let app: ExoApiApplication;
let client: Client;
before('setupApplication', async () => {
({app, client} = await setupApplication());
});
after(async () => {
await app.stop();
});
it('invokes GET /ping', async () => {
const res = await client.get('/ping?msg=world').expect(200);
expect(res.body).to.containEql({greeting: 'Hello from LoopBack'});
});
});

View file

@ -0,0 +1,32 @@
import {ExoApiApplication} from '../..';
import {
createRestAppClient,
givenHttpServerConfig,
Client,
} from '@loopback/testlab';
export async function setupApplication(): Promise<AppWithClient> {
const restConfig = givenHttpServerConfig({
// Customize the server configuration here.
// Empty values (undefined, '') will be ignored by the helper.
//
// host: process.env.HOST,
// port: +process.env.PORT,
});
const app = new ExoApiApplication({
rest: restConfig,
});
await app.boot();
await app.start();
const client = createRestAppClient(app);
return {app, client};
}
export interface AppWithClient {
app: ExoApiApplication;
client: Client;
}

42
src/application.ts Normal file
View file

@ -0,0 +1,42 @@
import {BootMixin} from '@loopback/boot';
import {ApplicationConfig} from '@loopback/core';
import {
RestExplorerBindings,
RestExplorerComponent,
} from '@loopback/rest-explorer';
import {RepositoryMixin} from '@loopback/repository';
import {RestApplication} from '@loopback/rest';
import {ServiceMixin} from '@loopback/service-proxy';
import * as path from 'path';
import {MySequence} from './sequence';
export class ExoApiApplication extends BootMixin(
ServiceMixin(RepositoryMixin(RestApplication)),
) {
constructor(options: ApplicationConfig = {}) {
super(options);
// Set up the custom sequence
this.sequence(MySequence);
// Set up default home page
this.static('/', path.join(__dirname, '../public'));
// Customize @loopback/rest-explorer configuration here
this.bind(RestExplorerBindings.CONFIG).to({
path: '/explorer',
});
this.component(RestExplorerComponent);
this.projectRoot = __dirname;
// Customize @loopback/boot Booter Conventions here
this.bootOptions = {
controllers: {
// Customize ControllerBooter Conventions here
dirs: ['controllers'],
extensions: ['.controller.js'],
nested: true,
},
};
}
}

View file

@ -0,0 +1,9 @@
# Controllers
This directory contains source files for the controllers exported by this app.
To add a new empty controller, type in `lb4 controller [<name>]` from the
command-line of your application's root directory.
For more information, please visit
[Controller generator](http://loopback.io/doc/en/lb4/Controller-generator.html).

2
src/controllers/index.ts Normal file
View file

@ -0,0 +1,2 @@
export * from './ping.controller';
export * from './radius.controller';

View file

@ -0,0 +1,51 @@
import {Request, RestBindings, get, ResponseObject} from '@loopback/rest';
import {inject} from '@loopback/context';
/**
* OpenAPI response for ping()
*/
const PING_RESPONSE: ResponseObject = {
description: 'Ping Response',
content: {
'application/json': {
schema: {
type: 'object',
properties: {
greeting: {type: 'string'},
date: {type: 'string'},
url: {type: 'string'},
headers: {
type: 'object',
properties: {
'Content-Type': {type: 'string'},
},
additionalProperties: true,
},
},
},
},
},
};
/**
* A simple controller to bounce back http requests
*/
export class PingController {
constructor(@inject(RestBindings.Http.REQUEST) private req: Request) {}
// Map to `GET /ping`
@get('/ping', {
responses: {
'200': PING_RESPONSE,
},
})
ping(): object {
// Reply with a greeting, the current time, the url, and request headers
return {
greeting: 'Hello from LoopBack',
date: new Date(),
url: this.req.url,
headers: Object.assign({}, this.req.headers),
};
}
}

View file

@ -0,0 +1,101 @@
import { post, get, param, requestBody } from "@loopback/rest";
// Uncomment these imports to begin using these cool features!
import { inject } from '@loopback/context';
import { RadreplyRepository, SubscriptionIdsRepository, UserinfoRepository, RadcheckRepository, RadusergroupRepository } from "../repositories";
import { SubscriptionIds, Userinfo, Radcheck, Radusergroup, Radreply } from "../models";
// TODO move to declarations class or similar
export interface BatchUser {
name: string;
password: string;
['remote-address']: string;
}
export interface BatchBody {
data: Array<BatchUser>;
}
export class RadiusController {
constructor(
@inject('repositories.RadreplyRepository')
public radReplyRepository: RadreplyRepository,
@inject('repositories.SubscriptionIdsRepository')
public subscriptionIdsRepository: SubscriptionIdsRepository,
@inject('repositories.UserinfoRepository')
public userinfoRepository: UserinfoRepository,
@inject('repositories.RadcheckRepository')
public radcheckRepository: RadcheckRepository,
@inject('repositories.RadusergroupRepository')
public radusergroupRepository: RadusergroupRepository, ) { }
@post('/radius/batch')
async subscriptionAddBatch(@requestBody() body: BatchBody) {
console.log('Users:', body);
body.data.forEach(async (item) => {
// 1: look for an available subscriptionid
const id = await this.subscriptionIdsRepository.find(
{ where: { isAvailable: true }, limit: 1, order: ['id ASC'] });
// 2: Add user to Userinfo repo
const userInfo = new Userinfo();
userInfo.username = item.name;
userInfo.creationby = 'administrator'; // TODO: Remove hardcoded
userInfo.creationdate = new Date();
userInfo.updatedate = new Date();
// Wait for user creation
await this.userinfoRepository.create(userInfo);
// 3: Add user password
const userRadCheck = new Radcheck();
userRadCheck.username = item.name;
userRadCheck.op = ':=';
userRadCheck.attribute = 'Cleartext-Password'
userRadCheck.value = item.password;
await this.radcheckRepository.create(userRadCheck);
// 4: Add user to group
const userRadGroup = new Radusergroup();
userRadGroup.username = item.name;
userRadGroup.groupname = 'PPP-Standard';
userRadGroup.priority = 1;
await this.radusergroupRepository.create(userRadGroup);
// 5: Add IPs to subscription & nas-id
const userReplyIpv4 = new Radreply();
userReplyIpv4.username = item.name;
userReplyIpv4.op = ':=';
userReplyIpv4.attribute = 'Framed-IP-Address';
userReplyIpv4.value = item['remote-address'];
await this.radReplyRepository.create(userReplyIpv4);
const userReplyNas = new Radreply();
userReplyNas.username = item.name;
userReplyNas.op = ':=';
userReplyNas.attribute = 'NAS-Port-Id';
userReplyNas.value = `i${id[0].id}c0`;
await this.radReplyRepository.create(userReplyNas);
});
return 1;
}
@get('/radius/test')
async test() {
// TODO put in another endpoint
const subs = [];
for (let i = 10; i <= 8999; ++i) {
const item = new SubscriptionIds();
item.id = i;
item.isAvailable = true;
subs.push(item);
}
return await this.subscriptionIdsRepository.createAll(subs);
}
}

View file

@ -0,0 +1,3 @@
# Datasources
This directory contains config for datasources used by this app.

1
src/datasources/index.ts Normal file
View file

@ -0,0 +1 @@
export * from './radius.datasource';

View file

@ -0,0 +1,9 @@
{
"name": "radius",
"connector": "mysql",
"host": "localhost",
"port": 3306,
"user": "radius",
"password": "radius",
"database": "radius"
}

View file

@ -0,0 +1,14 @@
import {inject} from '@loopback/core';
import {juggler} from '@loopback/repository';
import * as config from './radius.datasource.json';
export class RadiusDataSource extends juggler.DataSource {
static dataSourceName = 'radius';
constructor(
@inject('datasources.config.radius', {optional: true})
dsConfig: object = config,
) {
super(dsConfig);
}
}

16
src/index.ts Normal file
View file

@ -0,0 +1,16 @@
import {ExoApiApplication} from './application';
import {ApplicationConfig} from '@loopback/core';
export {ExoApiApplication};
export async function main(options: ApplicationConfig = {}) {
const app = new ExoApiApplication(options);
await app.boot();
await app.start();
const url = app.restServer.url;
console.log(`Server is running at ${url}`);
console.log(`Try ${url}/ping`);
return app;
}

21
src/migrate.ts Normal file
View file

@ -0,0 +1,21 @@
import { ExoApiApplication } from './application';
export async function migrate(args: string[]) {
const existingSchema = args.includes('--rebuild') ? 'drop' : 'alter';
console.log('Migrating schemas (%s existing schema)', existingSchema);
const app = new ExoApiApplication();
await app.boot();
// We only add custom eXO models
await app.migrateSchema({ existingSchema, models: ['SubscriptionIds'] });
// Connectors usually keep a pool of opened connections,
// this keeps the process running even after all work is done.
// We need to exit explicitly.
process.exit(0);
}
migrate(process.argv).catch(err => {
console.error('Cannot migrate database schema', err);
process.exit(1);
});

3
src/models/README.md Normal file
View file

@ -0,0 +1,3 @@
# Models
This directory contains code for models provided by this app.

13
src/models/index.ts Normal file
View file

@ -0,0 +1,13 @@
export * from './realms.model';
export * from './radusergroup.model';
export * from './radgroupreply.model';
export * from './radpostauth.model';
export * from './radcheck.model';
export * from './radreply.model';
export * from './userinfo.model';
export * from './operators-acl.model';
export * from './radgroupcheck.model';
export * from './operators-acl-files.model';
export * from './operators.model';
export * from './userbillinfo.model';
export * from './subscription-ids.model';

View file

@ -0,0 +1,56 @@
import { Entity, model, property } from '@loopback/repository';
@model({
settings: { idInjection: false, mysql: { schema: 'radius', table: 'operators_acl_files' } }
})
export class OperatorsAclFiles extends Entity {
@property({
type: Number,
generated: true,
precision: 10,
scale: 0,
id: 1,
mysql: { "columnName": "id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
})
id: Number;
@property({
type: String,
required: true,
length: 128,
mysql: { "columnName": "file", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
file: String;
@property({
type: String,
required: true,
length: 128,
mysql: { "columnName": "category", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
category: String;
@property({
type: String,
required: true,
length: 128,
mysql: { "columnName": "section", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
section: String;
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<OperatorsAclFiles>) {
super(data);
}
}
export interface OperatorsAclFilesRelations {
// describe navigational properties here
}
export type OperatorsAclFilesWithRelations = OperatorsAclFiles & OperatorsAclFilesRelations;

View file

@ -0,0 +1,58 @@
import { Entity, model, property } from '@loopback/repository';
@model({
settings: { idInjection: false, mysql: { schema: 'radius', table: 'operators_acl' } }
})
export class OperatorsAcl extends Entity {
@property({
type: Number,
generated: 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,
required: true,
precision: 10,
scale: 0,
mysql: { "columnName": "operator_id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
})
operatorId: Number;
@property({
type: String,
required: true,
length: 128,
mysql: { "columnName": "file", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
file: String;
@property({
type: Number,
required: true,
precision: 3,
scale: 0,
mysql: { "columnName": "access", "dataType": "tinyint", "dataLength": null, "dataPrecision": 3, "dataScale": 0, "nullable": "N" },
})
access: Number;
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<OperatorsAcl>) {
super(data);
}
}
export interface OperatorsAclRelations {
// describe navigational properties here
}
export type OperatorsAclWithRelations = OperatorsAcl & OperatorsAclRelations;

View file

@ -0,0 +1,179 @@
import { Entity, model, property } from '@loopback/repository';
@model({ settings: { idInjection: false, mysql: { schema: 'radius', table: 'operators' } } })
export class Operators extends Entity {
@property({
type: Number,
generated: true,
precision: 10,
scale: 0,
id: 1,
mysql: { "columnName": "id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
})
id: Number;
@property({
type: String,
required: true,
length: 32,
mysql: { "columnName": "username", "dataType": "varchar", "dataLength": 32, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
username: String;
@property({
type: String,
required: true,
length: 32,
mysql: { "columnName": "password", "dataType": "varchar", "dataLength": 32, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
password: String;
@property({
type: String,
required: true,
length: 32,
mysql: { "columnName": "firstname", "dataType": "varchar", "dataLength": 32, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
firstname: String;
@property({
type: String,
required: true,
length: 32,
mysql: { "columnName": "lastname", "dataType": "varchar", "dataLength": 32, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
lastname: String;
@property({
type: String,
required: true,
length: 32,
mysql: { "columnName": "title", "dataType": "varchar", "dataLength": 32, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
title: String;
@property({
type: String,
required: true,
length: 32,
mysql: { "columnName": "department", "dataType": "varchar", "dataLength": 32, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
department: String;
@property({
type: String,
required: true,
length: 32,
mysql: { "columnName": "company", "dataType": "varchar", "dataLength": 32, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
company: String;
@property({
type: String,
required: true,
length: 32,
mysql: { "columnName": "phone1", "dataType": "varchar", "dataLength": 32, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
phone1: String;
@property({
type: String,
required: true,
length: 32,
mysql: { "columnName": "phone2", "dataType": "varchar", "dataLength": 32, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
phone2: String;
@property({
type: String,
required: true,
length: 32,
mysql: { "columnName": "email1", "dataType": "varchar", "dataLength": 32, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
email1: String;
@property({
type: String,
required: true,
length: 32,
mysql: { "columnName": "email2", "dataType": "varchar", "dataLength": 32, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
email2: String;
@property({
type: String,
required: true,
length: 32,
mysql: { "columnName": "messenger1", "dataType": "varchar", "dataLength": 32, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
messenger1: String;
@property({
type: String,
required: true,
length: 32,
mysql: { "columnName": "messenger2", "dataType": "varchar", "dataLength": 32, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
messenger2: String;
@property({
type: String,
required: true,
length: 128,
mysql: { "columnName": "notes", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
notes: String;
@property({
type: Date,
required: false,
mysql: { "columnName": "lastlogin", "dataType": "datetime", "dataLength": null, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
lastlogin?: Date;
@property({
type: Date,
required: false,
mysql: { "columnName": "creationdate", "dataType": "datetime", "dataLength": null, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
creationdate?: Date;
@property({
type: String,
required: false,
length: 128,
mysql: { "columnName": "creationby", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
creationby?: String;
@property({
type: Date,
required: false,
mysql: { "columnName": "updatedate", "dataType": "datetime", "dataLength": null, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
updatedate?: Date;
@property({
type: String,
required: false,
length: 128,
mysql: { "columnName": "updateby", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
updateby?: String;
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<Operators>) {
super(data);
}
}
export interface OperatorsRelations {
// describe navigational properties here
}
export type OperatorsWithRelations = Operators & OperatorsRelations;

View file

@ -0,0 +1,62 @@
import { Entity, model, property } from '@loopback/repository';
@model({ settings: { idInjection: false, mysql: { schema: 'radius', table: 'radcheck' } } })
export class Radcheck extends Entity {
@property({
type: Number,
generated: true,
precision: 10,
scale: 0,
id: 1,
mysql: { "columnName": "id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
})
id: Number;
@property({
type: String,
required: true,
length: 64,
mysql: { "columnName": "username", "dataType": "varchar", "dataLength": 64, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
username: String;
@property({
type: String,
required: true,
length: 64,
mysql: { "columnName": "attribute", "dataType": "varchar", "dataLength": 64, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
attribute: String;
@property({
type: String,
required: true,
length: 2,
mysql: { "columnName": "op", "dataType": "char", "dataLength": 2, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
op: String;
@property({
type: String,
required: true,
length: 253,
mysql: { "columnName": "value", "dataType": "varchar", "dataLength": 253, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
value: String;
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<Radcheck>) {
super(data);
}
}
export interface RadcheckRelations {
// describe navigational properties here
}
export type RadcheckWithRelations = Radcheck & RadcheckRelations;

View file

@ -0,0 +1,64 @@
import { Entity, model, property } from '@loopback/repository';
@model({
settings: { idInjection: false, mysql: { schema: 'radius', table: 'radgroupcheck' } }
})
export class Radgroupcheck extends Entity {
@property({
type: Number,
generated: true,
precision: 10,
scale: 0,
id: 1,
mysql: { "columnName": "id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
})
id: Number;
@property({
type: String,
required: true,
length: 64,
mysql: { "columnName": "groupname", "dataType": "varchar", "dataLength": 64, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
groupname: String;
@property({
type: String,
required: true,
length: 64,
mysql: { "columnName": "attribute", "dataType": "varchar", "dataLength": 64, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
attribute: String;
@property({
type: String,
required: true,
length: 2,
mysql: { "columnName": "op", "dataType": "char", "dataLength": 2, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
op: String;
@property({
type: String,
required: true,
length: 253,
mysql: { "columnName": "value", "dataType": "varchar", "dataLength": 253, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
value: String;
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<Radgroupcheck>) {
super(data);
}
}
export interface RadgroupcheckRelations {
// describe navigational properties here
}
export type RadgroupcheckWithRelations = Radgroupcheck & RadgroupcheckRelations;

View file

@ -0,0 +1,64 @@
import { Entity, model, property } from '@loopback/repository';
@model({
settings: { idInjection: false, mysql: { schema: 'radius', table: 'radgroupreply' } }
})
export class Radgroupreply extends Entity {
@property({
type: Number,
generated: true,
precision: 10,
scale: 0,
id: 1,
mysql: { "columnName": "id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
})
id: Number;
@property({
type: String,
required: true,
length: 64,
mysql: { "columnName": "groupname", "dataType": "varchar", "dataLength": 64, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
groupname: String;
@property({
type: String,
required: true,
length: 64,
mysql: { "columnName": "attribute", "dataType": "varchar", "dataLength": 64, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
attribute: String;
@property({
type: String,
required: true,
length: 2,
mysql: { "columnName": "op", "dataType": "char", "dataLength": 2, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
op: String;
@property({
type: String,
required: true,
length: 253,
mysql: { "columnName": "value", "dataType": "varchar", "dataLength": 253, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
value: String;
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<Radgroupreply>) {
super(data);
}
}
export interface RadgroupreplyRelations {
// describe navigational properties here
}
export type RadgroupreplyWithRelations = Radgroupreply & RadgroupreplyRelations;

View file

@ -0,0 +1,63 @@
import { Entity, model, property } from '@loopback/repository';
@model({
settings: { idInjection: false, mysql: { schema: 'radius', table: 'radpostauth' } }
})
export class Radpostauth extends Entity {
@property({
type: Number,
generated: true,
precision: 10,
scale: 0,
id: 1,
mysql: { "columnName": "id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
})
id: Number;
@property({
type: String,
required: true,
length: 64,
mysql: { "columnName": "username", "dataType": "varchar", "dataLength": 64, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
username: String;
@property({
type: String,
required: true,
length: 64,
mysql: { "columnName": "pass", "dataType": "varchar", "dataLength": 64, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
pass: String;
@property({
type: String,
required: true,
length: 32,
mysql: { "columnName": "reply", "dataType": "varchar", "dataLength": 32, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
reply: String;
@property({
type: Date,
required: true,
mysql: { "columnName": "authdate", "dataType": "timestamp", "dataLength": null, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
authdate: Date;
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<Radpostauth>) {
super(data);
}
}
export interface RadpostauthRelations {
// describe navigational properties here
}
export type RadpostauthWithRelations = Radpostauth & RadpostauthRelations;

View file

@ -0,0 +1,62 @@
import { Entity, model, property } from '@loopback/repository';
@model({ settings: { idInjection: false, mysql: { schema: 'radius', table: 'radreply' } } })
export class Radreply extends Entity {
@property({
type: Number,
precision: 10,
scale: 0,
id: 1,
generated: true,
mysql: { "columnName": "id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
})
id: Number;
@property({
type: String,
required: true,
length: 64,
mysql: { "columnName": "username", "dataType": "varchar", "dataLength": 64, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
username: String;
@property({
type: String,
required: true,
length: 64,
mysql: { "columnName": "attribute", "dataType": "varchar", "dataLength": 64, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
attribute: String;
@property({
type: String,
required: true,
length: 2,
mysql: { "columnName": "op", "dataType": "char", "dataLength": 2, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
op: String;
@property({
type: String,
required: true,
length: 253,
mysql: { "columnName": "value", "dataType": "varchar", "dataLength": 253, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
value: String;
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<Radreply>) {
super(data);
}
}
export interface RadreplyRelations {
// describe navigational properties here
}
export type RadreplyWithRelations = Radreply & RadreplyRelations;

View file

@ -0,0 +1,48 @@
import { Entity, model, property } from '@loopback/repository';
@model({
settings: { idInjection: false, mysql: { schema: 'radius', table: 'radusergroup' } }
})
export class Radusergroup extends Entity {
@property({
type: String,
required: true,
length: 64,
id: true,
mysql: { "columnName": "username", "dataType": "varchar", "dataLength": 64, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
username: String;
@property({
type: String,
required: true,
length: 64,
mysql: { "columnName": "groupname", "dataType": "varchar", "dataLength": 64, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
groupname: String;
@property({
type: Number,
required: true,
precision: 10,
scale: 0,
mysql: { "columnName": "priority", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
})
priority: Number;
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<Radusergroup>) {
super(data);
}
}
export interface RadusergroupRelations {
// describe navigational properties here
}
export type RadusergroupWithRelations = Radusergroup & RadusergroupRelations;

135
src/models/realms.model.ts Normal file
View file

@ -0,0 +1,135 @@
import { Entity, model, property } from '@loopback/repository';
@model({ settings: { idInjection: false, mysql: { schema: 'radius', table: 'realms' } } })
export class Realms extends Entity {
@property({
type: Number,
generated: true,
precision: 19,
scale: 0,
id: 1,
mysql: { "columnName": "id", "dataType": "bigint", "dataLength": null, "dataPrecision": 19, "dataScale": 0, "nullable": "N" },
})
id: Number;
@property({
type: String,
required: false,
length: 128,
mysql: { "columnName": "realmname", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
realmname?: String;
@property({
type: String,
required: false,
length: 32,
mysql: { "columnName": "type", "dataType": "varchar", "dataLength": 32, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
type?: String;
@property({
type: String,
required: false,
length: 256,
mysql: { "columnName": "authhost", "dataType": "varchar", "dataLength": 256, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
authhost?: String;
@property({
type: String,
required: false,
length: 256,
mysql: { "columnName": "accthost", "dataType": "varchar", "dataLength": 256, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
accthost?: String;
@property({
type: String,
required: false,
length: 128,
mysql: { "columnName": "secret", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
secret?: String;
@property({
type: String,
required: false,
length: 64,
mysql: { "columnName": "ldflag", "dataType": "varchar", "dataLength": 64, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
ldflag?: String;
@property({
type: Number,
required: false,
precision: 10,
scale: 0,
mysql: { "columnName": "nostrip", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "Y" },
})
nostrip?: Number;
@property({
type: Number,
required: false,
precision: 10,
scale: 0,
mysql: { "columnName": "hints", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "Y" },
})
hints?: Number;
@property({
type: Number,
required: false,
precision: 10,
scale: 0,
mysql: { "columnName": "notrealm", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "Y" },
})
notrealm?: Number;
@property({
type: Date,
required: false,
mysql: { "columnName": "creationdate", "dataType": "datetime", "dataLength": null, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
creationdate?: Date;
@property({
type: String,
required: false,
length: 128,
mysql: { "columnName": "creationby", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
creationby?: String;
@property({
type: Date,
required: false,
mysql: { "columnName": "updatedate", "dataType": "datetime", "dataLength": null, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
updatedate?: Date;
@property({
type: String,
required: false,
length: 128,
mysql: { "columnName": "updateby", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
updateby?: String;
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<Realms>) {
super(data);
}
}
export interface RealmsRelations {
// describe navigational properties here
}
export type RealmsWithRelations = Realms & RealmsRelations;

View file

@ -0,0 +1,41 @@
import { Entity, model, property } from '@loopback/repository';
@model({ settings: { idInjection: false, mysql: { schema: 'radius', table: 'subscriptionids' } } })
export class SubscriptionIds extends Entity {
@property({
type: Number,
generated: false,
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: Boolean,
required: false,
length: 200,
mysql: { "columnName": "isAvailable", "nullable": "N" },
})
isAvailable: boolean;
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<SubscriptionIds>) {
super(data);
}
}
export interface SubscriptionIdsRelations {
// describe navigational properties here
}
export type SubscriptionIdsWithRelations = SubscriptionIds & SubscriptionIdsRelations;

View file

@ -0,0 +1,336 @@
import { Entity, model, property } from '@loopback/repository';
@model({
settings: { idInjection: false, mysql: { schema: 'radius', table: 'userbillinfo' } }
})
export class Userbillinfo extends Entity {
@property({
type: Number,
generated: true,
precision: 10,
scale: 0,
id: 1,
mysql: { "columnName": "id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
})
id: Number;
@property({
type: String,
required: false,
length: 128,
mysql: { "columnName": "username", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
username?: String;
@property({
type: String,
required: false,
length: 128,
mysql: { "columnName": "planName", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
planname?: String;
@property({
type: Number,
required: false,
precision: 10,
scale: 0,
mysql: { "columnName": "hotspot_id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "Y" },
})
hotspotId?: Number;
@property({
type: String,
required: false,
length: 32,
mysql: { "columnName": "hotspotlocation", "dataType": "varchar", "dataLength": 32, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
hotspotlocation?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "contactperson", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
contactperson?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "company", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
company?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "email", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
email?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "phone", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
phone?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "address", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
address?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "city", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
city?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "state", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
state?: String;
@property({
type: String,
required: false,
length: 100,
mysql: { "columnName": "country", "dataType": "varchar", "dataLength": 100, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
country?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "zip", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
zip?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "paymentmethod", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
paymentmethod?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "cash", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
cash?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "creditcardname", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
creditcardname?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "creditcardnumber", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
creditcardnumber?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "creditcardverification", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
creditcardverification?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "creditcardtype", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
creditcardtype?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "creditcardexp", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
creditcardexp?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "notes", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
notes?: String;
@property({
type: String,
required: false,
length: 128,
mysql: { "columnName": "changeuserbillinfo", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
changeuserbillinfo?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "lead", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
lead?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "coupon", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
coupon?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "ordertaker", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
ordertaker?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "billstatus", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
billstatus?: String;
@property({
type: Date,
required: true,
mysql: { "columnName": "lastbill", "dataType": "date", "dataLength": null, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
lastbill: Date;
@property({
type: Date,
required: true,
mysql: { "columnName": "nextbill", "dataType": "date", "dataLength": null, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
nextbill: Date;
@property({
type: Number,
required: false,
precision: 10,
scale: 0,
mysql: { "columnName": "nextinvoicedue", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "Y" },
})
nextinvoicedue?: Number;
@property({
type: Number,
required: false,
precision: 10,
scale: 0,
mysql: { "columnName": "billdue", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "Y" },
})
billdue?: Number;
@property({
type: String,
required: false,
length: 8,
mysql: { "columnName": "postalinvoice", "dataType": "varchar", "dataLength": 8, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
postalinvoice?: String;
@property({
type: String,
required: false,
length: 8,
mysql: { "columnName": "faxinvoice", "dataType": "varchar", "dataLength": 8, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
faxinvoice?: String;
@property({
type: String,
required: false,
length: 8,
mysql: { "columnName": "emailinvoice", "dataType": "varchar", "dataLength": 8, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
emailinvoice?: String;
@property({
type: Number,
required: false,
precision: 10,
scale: 0,
mysql: { "columnName": "batch_id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "Y" },
})
batchId?: Number;
@property({
type: Date,
required: false,
mysql: { "columnName": "creationdate", "dataType": "datetime", "dataLength": null, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
creationdate?: Date;
@property({
type: String,
required: false,
length: 128,
mysql: { "columnName": "creationby", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
creationby?: String;
@property({
type: Date,
required: false,
mysql: { "columnName": "updatedate", "dataType": "datetime", "dataLength": null, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
updatedate?: Date;
@property({
type: String,
required: false,
length: 128,
mysql: { "columnName": "updateby", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
updateby?: String;
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<Userbillinfo>) {
super(data);
}
}
export interface UserbillinfoRelations {
// describe navigational properties here
}
export type UserbillinfoWithRelations = Userbillinfo & UserbillinfoRelations;

View file

@ -0,0 +1,205 @@
import { Entity, model, property } from '@loopback/repository';
@model({ settings: { idInjection: false, mysql: { schema: 'radius', table: 'userinfo' } } })
export class Userinfo extends Entity {
@property({
type: Number,
generated: true,
precision: 10,
scale: 0,
id: 1,
mysql: { "columnName": "id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
})
id: Number;
@property({
type: String,
required: false,
length: 128,
mysql: { "columnName": "username", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
username?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "firstname", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
firstname?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "lastname", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
lastname?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "email", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
email?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "department", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
department?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "company", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
company?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "workphone", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
workphone?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "homephone", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
homephone?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "mobilephone", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
mobilephone?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "address", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
address?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "city", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
city?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "state", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
state?: String;
@property({
type: String,
required: false,
length: 100,
mysql: { "columnName": "country", "dataType": "varchar", "dataLength": 100, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
country?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "zip", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
zip?: String;
@property({
type: String,
required: false,
length: 200,
mysql: { "columnName": "notes", "dataType": "varchar", "dataLength": 200, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
notes?: String;
@property({
type: String,
required: false,
length: 128,
mysql: { "columnName": "changeuserinfo", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
changeuserinfo?: String;
@property({
type: String,
required: false,
length: 128,
mysql: { "columnName": "portalloginpassword", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
portalloginpassword?: String;
@property({
type: Number,
required: false,
precision: 10,
scale: 0,
mysql: { "columnName": "enableportallogin", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "Y" },
})
enableportallogin?: Number;
@property({
type: Date,
required: false,
mysql: { "columnName": "creationdate", "dataType": "datetime", "dataLength": null, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
creationdate?: Date;
@property({
type: String,
required: false,
length: 128,
mysql: { "columnName": "creationby", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
creationby?: String;
@property({
type: Date,
required: false,
mysql: { "columnName": "updatedate", "dataType": "datetime", "dataLength": null, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
updatedate?: Date;
@property({
type: String,
required: false,
length: 128,
mysql: { "columnName": "updateby", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
updateby?: String;
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<Userinfo>) {
super(data);
}
}
export interface UserinfoRelations {
// describe navigational properties here
}
export type UserinfoWithRelations = Userinfo & UserinfoRelations;

View file

@ -0,0 +1,3 @@
# Repositories
This directory contains code for repositories provided by this app.

13
src/repositories/index.ts Normal file
View file

@ -0,0 +1,13 @@
export * from './operators-acl-files.repository';
export * from './operators-acl.repository';
export * from './operators.repository';
export * from './radcheck.repository';
export * from './radgroupcheck.repository';
export * from './radgroupreply.repository';
export * from './radpostauth.repository';
export * from './radreply.repository';
export * from './radusergroup.repository';
export * from './realms.repository';
export * from './userbillinfo.repository';
export * from './userinfo.repository';
export * from './subscription-ids.repository';

View file

@ -0,0 +1,16 @@
import {DefaultCrudRepository} from '@loopback/repository';
import {OperatorsAclFiles, OperatorsAclFilesRelations} from '../models';
import {RadiusDataSource} from '../datasources';
import {inject} from '@loopback/core';
export class OperatorsAclFilesRepository extends DefaultCrudRepository<
OperatorsAclFiles,
typeof OperatorsAclFiles.prototype.id,
OperatorsAclFilesRelations
> {
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
) {
super(OperatorsAclFiles, dataSource);
}
}

View file

@ -0,0 +1,16 @@
import {DefaultCrudRepository} from '@loopback/repository';
import {OperatorsAcl, OperatorsAclRelations} from '../models';
import {RadiusDataSource} from '../datasources';
import {inject} from '@loopback/core';
export class OperatorsAclRepository extends DefaultCrudRepository<
OperatorsAcl,
typeof OperatorsAcl.prototype.id,
OperatorsAclRelations
> {
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
) {
super(OperatorsAcl, dataSource);
}
}

View file

@ -0,0 +1,16 @@
import {DefaultCrudRepository} from '@loopback/repository';
import {Operators, OperatorsRelations} from '../models';
import {RadiusDataSource} from '../datasources';
import {inject} from '@loopback/core';
export class OperatorsRepository extends DefaultCrudRepository<
Operators,
typeof Operators.prototype.id,
OperatorsRelations
> {
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
) {
super(Operators, dataSource);
}
}

View file

@ -0,0 +1,16 @@
import {DefaultCrudRepository} from '@loopback/repository';
import {Radcheck, RadcheckRelations} from '../models';
import {RadiusDataSource} from '../datasources';
import {inject} from '@loopback/core';
export class RadcheckRepository extends DefaultCrudRepository<
Radcheck,
typeof Radcheck.prototype.id,
RadcheckRelations
> {
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
) {
super(Radcheck, dataSource);
}
}

View file

@ -0,0 +1,16 @@
import {DefaultCrudRepository} from '@loopback/repository';
import {Radgroupcheck, RadgroupcheckRelations} from '../models';
import {RadiusDataSource} from '../datasources';
import {inject} from '@loopback/core';
export class RadgroupcheckRepository extends DefaultCrudRepository<
Radgroupcheck,
typeof Radgroupcheck.prototype.id,
RadgroupcheckRelations
> {
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
) {
super(Radgroupcheck, dataSource);
}
}

View file

@ -0,0 +1,16 @@
import {DefaultCrudRepository} from '@loopback/repository';
import {Radgroupreply, RadgroupreplyRelations} from '../models';
import {RadiusDataSource} from '../datasources';
import {inject} from '@loopback/core';
export class RadgroupreplyRepository extends DefaultCrudRepository<
Radgroupreply,
typeof Radgroupreply.prototype.id,
RadgroupreplyRelations
> {
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
) {
super(Radgroupreply, dataSource);
}
}

View file

@ -0,0 +1,16 @@
import {DefaultCrudRepository} from '@loopback/repository';
import {Radpostauth, RadpostauthRelations} from '../models';
import {RadiusDataSource} from '../datasources';
import {inject} from '@loopback/core';
export class RadpostauthRepository extends DefaultCrudRepository<
Radpostauth,
typeof Radpostauth.prototype.id,
RadpostauthRelations
> {
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
) {
super(Radpostauth, dataSource);
}
}

View file

@ -0,0 +1,16 @@
import {DefaultCrudRepository} from '@loopback/repository';
import {Radreply, RadreplyRelations} from '../models';
import {RadiusDataSource} from '../datasources';
import {inject} from '@loopback/core';
export class RadreplyRepository extends DefaultCrudRepository<
Radreply,
typeof Radreply.prototype.id,
RadreplyRelations
> {
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
) {
super(Radreply, dataSource);
}
}

View file

@ -0,0 +1,16 @@
import {DefaultCrudRepository} from '@loopback/repository';
import {Radusergroup, RadusergroupRelations} from '../models';
import {RadiusDataSource} from '../datasources';
import {inject} from '@loopback/core';
export class RadusergroupRepository extends DefaultCrudRepository<
Radusergroup,
typeof Radusergroup.prototype.id,
RadusergroupRelations
> {
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
) {
super(Radusergroup, dataSource);
}
}

View file

@ -0,0 +1,16 @@
import {DefaultCrudRepository} from '@loopback/repository';
import {Realms, RealmsRelations} from '../models';
import {RadiusDataSource} from '../datasources';
import {inject} from '@loopback/core';
export class RealmsRepository extends DefaultCrudRepository<
Realms,
typeof Realms.prototype.id,
RealmsRelations
> {
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
) {
super(Realms, dataSource);
}
}

View file

@ -0,0 +1,16 @@
import {DefaultCrudRepository} from '@loopback/repository';
import {SubscriptionIds, SubscriptionIdsRelations} from '../models';
import {RadiusDataSource} from '../datasources';
import {inject} from '@loopback/core';
export class SubscriptionIdsRepository extends DefaultCrudRepository<
SubscriptionIds,
typeof SubscriptionIds.prototype.id,
SubscriptionIdsRelations
> {
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
) {
super(SubscriptionIds, dataSource);
}
}

View file

@ -0,0 +1,16 @@
import {DefaultCrudRepository} from '@loopback/repository';
import {Userbillinfo, UserbillinfoRelations} from '../models';
import {RadiusDataSource} from '../datasources';
import {inject} from '@loopback/core';
export class UserbillinfoRepository extends DefaultCrudRepository<
Userbillinfo,
typeof Userbillinfo.prototype.id,
UserbillinfoRelations
> {
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
) {
super(Userbillinfo, dataSource);
}
}

View file

@ -0,0 +1,16 @@
import {DefaultCrudRepository} from '@loopback/repository';
import {Userinfo, UserinfoRelations} from '../models';
import {RadiusDataSource} from '../datasources';
import {inject} from '@loopback/core';
export class UserinfoRepository extends DefaultCrudRepository<
Userinfo,
typeof Userinfo.prototype.id,
UserinfoRelations
> {
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
) {
super(Userinfo, dataSource);
}
}

35
src/sequence.ts Normal file
View file

@ -0,0 +1,35 @@
import {inject} from '@loopback/context';
import {
FindRoute,
InvokeMethod,
ParseParams,
Reject,
RequestContext,
RestBindings,
Send,
SequenceHandler,
} from '@loopback/rest';
const SequenceActions = RestBindings.SequenceActions;
export class MySequence implements SequenceHandler {
constructor(
@inject(SequenceActions.FIND_ROUTE) protected findRoute: FindRoute,
@inject(SequenceActions.PARSE_PARAMS) protected parseParams: ParseParams,
@inject(SequenceActions.INVOKE_METHOD) protected invoke: InvokeMethod,
@inject(SequenceActions.SEND) public send: Send,
@inject(SequenceActions.REJECT) public reject: Reject,
) {}
async handle(context: RequestContext) {
try {
const {request, response} = context;
const route = this.findRoute(request);
const args = await this.parseParams(request, route);
const result = await this.invoke(route, args);
this.send(response, result);
} catch (err) {
this.reject(context, err);
}
}
}

9
tsconfig.json Normal file
View file

@ -0,0 +1,9 @@
{
"$schema": "http://json.schemastore.org/tsconfig",
"extends": "@loopback/build/config/tsconfig.common.json",
"compilerOptions": {
"outDir": "dist",
"rootDir": "src"
},
"include": ["src"]
}