mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-21 22:31:46 +00:00
Compare commits
36 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ca832e8d88 | |||
| 12fc7f7b68 | |||
| 2770a189df | |||
| 2b162a8cc7 | |||
| 009d89fecf | |||
| 5c3b89578d | |||
| 303e7de433 | |||
| 08eb7f3733 | |||
| 90d86eda61 | |||
| 0eca6d54a1 | |||
| bc1fb71391 | |||
| cb425fb397 | |||
| 35ed712d46 | |||
| 4923973380 | |||
| 8342cf3010 | |||
| 2a37eeccb3 | |||
| ae0e59d9f1 | |||
| 50bb7573fd | |||
| b852317c84 | |||
| 4436b6f673 | |||
| 311647fd46 | |||
| 28dbd86d03 | |||
| 842d9760df | |||
| 58218ff5f6 | |||
| 83be5fc92a | |||
| 7798d2a3fd | |||
| ec1ed60117 | |||
| ed4c21eade | |||
| 9093948ff6 | |||
| 2cea4d73aa | |||
| a2a6f52e6e | |||
| 0978b40b6d | |||
| 6155b6dc86 | |||
| 314486325e | |||
| 523bca3a20 | |||
| d5be528d4b |
@@ -62,6 +62,7 @@ body:
|
|||||||
- Docker (standalone)
|
- Docker (standalone)
|
||||||
- Kubernetes / Helm
|
- Kubernetes / Helm
|
||||||
- Unraid template
|
- Unraid template
|
||||||
|
- Proxmox Community Script
|
||||||
- Sources
|
- Sources
|
||||||
- Other
|
- Other
|
||||||
validations:
|
validations:
|
||||||
|
|||||||
@@ -7,7 +7,10 @@ on:
|
|||||||
- 'docs/**'
|
- 'docs/**'
|
||||||
- '**/*.md'
|
- '**/*.md'
|
||||||
- 'wiki/**'
|
- 'wiki/**'
|
||||||
- '.github/workflows/wiki.yml'
|
- '.github/workflows/**'
|
||||||
|
- '.github/ISSUE_TEMPLATE/**'
|
||||||
|
- '.github/FUNDING.yml'
|
||||||
|
- '.github/PULL_REQUEST_TEMPLATE.md'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
bump:
|
bump:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
name: trek
|
name: trek
|
||||||
version: 3.0.9
|
version: 3.0.10
|
||||||
description: Minimal Helm chart for TREK app
|
description: Minimal Helm chart for TREK app
|
||||||
appVersion: "3.0.9"
|
appVersion: "3.0.10"
|
||||||
|
|||||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "trek-client",
|
"name": "trek-client",
|
||||||
"version": "3.0.9",
|
"version": "3.0.10",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "trek-client",
|
"name": "trek-client",
|
||||||
"version": "3.0.9",
|
"version": "3.0.10",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@react-pdf/renderer": "^4.3.2",
|
"@react-pdf/renderer": "^4.3.2",
|
||||||
"axios": "^1.6.7",
|
"axios": "^1.6.7",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "trek-client",
|
"name": "trek-client",
|
||||||
"version": "3.0.9",
|
"version": "3.0.10",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -1,56 +0,0 @@
|
|||||||
# compiled output
|
|
||||||
/dist
|
|
||||||
/node_modules
|
|
||||||
/build
|
|
||||||
|
|
||||||
# Logs
|
|
||||||
logs
|
|
||||||
*.log
|
|
||||||
npm-debug.log*
|
|
||||||
pnpm-debug.log*
|
|
||||||
yarn-debug.log*
|
|
||||||
yarn-error.log*
|
|
||||||
lerna-debug.log*
|
|
||||||
|
|
||||||
# OS
|
|
||||||
.DS_Store
|
|
||||||
|
|
||||||
# Tests
|
|
||||||
/coverage
|
|
||||||
/.nyc_output
|
|
||||||
|
|
||||||
# IDEs and editors
|
|
||||||
/.idea
|
|
||||||
.project
|
|
||||||
.classpath
|
|
||||||
.c9/
|
|
||||||
*.launch
|
|
||||||
.settings/
|
|
||||||
*.sublime-workspace
|
|
||||||
|
|
||||||
# IDE - VSCode
|
|
||||||
.vscode/*
|
|
||||||
!.vscode/settings.json
|
|
||||||
!.vscode/tasks.json
|
|
||||||
!.vscode/launch.json
|
|
||||||
!.vscode/extensions.json
|
|
||||||
|
|
||||||
# dotenv environment variable files
|
|
||||||
.env
|
|
||||||
.env.development.local
|
|
||||||
.env.test.local
|
|
||||||
.env.production.local
|
|
||||||
.env.local
|
|
||||||
|
|
||||||
# temp directory
|
|
||||||
.temp
|
|
||||||
.tmp
|
|
||||||
|
|
||||||
# Runtime data
|
|
||||||
pids
|
|
||||||
*.pid
|
|
||||||
*.seed
|
|
||||||
*.pid.lock
|
|
||||||
|
|
||||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
|
||||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"singleQuote": true,
|
|
||||||
"trailingComma": "all"
|
|
||||||
}
|
|
||||||
@@ -1,98 +0,0 @@
|
|||||||
<p align="center">
|
|
||||||
<a href="http://nestjs.com/" target="blank"><img src="https://nestjs.com/img/logo-small.svg" width="120" alt="Nest Logo" /></a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456
|
|
||||||
[circleci-url]: https://circleci.com/gh/nestjs/nest
|
|
||||||
|
|
||||||
<p align="center">A progressive <a href="http://nodejs.org" target="_blank">Node.js</a> framework for building efficient and scalable server-side applications.</p>
|
|
||||||
<p align="center">
|
|
||||||
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/v/@nestjs/core.svg" alt="NPM Version" /></a>
|
|
||||||
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/l/@nestjs/core.svg" alt="Package License" /></a>
|
|
||||||
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/common.svg" alt="NPM Downloads" /></a>
|
|
||||||
<a href="https://circleci.com/gh/nestjs/nest" target="_blank"><img src="https://img.shields.io/circleci/build/github/nestjs/nest/master" alt="CircleCI" /></a>
|
|
||||||
<a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a>
|
|
||||||
<a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a>
|
|
||||||
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://opencollective.com/nest/sponsors/badge.svg" alt="Sponsors on Open Collective" /></a>
|
|
||||||
<a href="https://paypal.me/kamilmysliwiec" target="_blank"><img src="https://img.shields.io/badge/Donate-PayPal-ff3f59.svg" alt="Donate us"/></a>
|
|
||||||
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://img.shields.io/badge/Support%20us-Open%20Collective-41B883.svg" alt="Support us"></a>
|
|
||||||
<a href="https://twitter.com/nestframework" target="_blank"><img src="https://img.shields.io/twitter/follow/nestframework.svg?style=social&label=Follow" alt="Follow us on Twitter"></a>
|
|
||||||
</p>
|
|
||||||
<!--[](https://opencollective.com/nest#backer)
|
|
||||||
[](https://opencollective.com/nest#sponsor)-->
|
|
||||||
|
|
||||||
## Description
|
|
||||||
|
|
||||||
[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository.
|
|
||||||
|
|
||||||
## Project setup
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ npm install
|
|
||||||
```
|
|
||||||
|
|
||||||
## Compile and run the project
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# development
|
|
||||||
$ npm run start
|
|
||||||
|
|
||||||
# watch mode
|
|
||||||
$ npm run start:dev
|
|
||||||
|
|
||||||
# production mode
|
|
||||||
$ npm run start:prod
|
|
||||||
```
|
|
||||||
|
|
||||||
## Run tests
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# unit tests
|
|
||||||
$ npm run test
|
|
||||||
|
|
||||||
# e2e tests
|
|
||||||
$ npm run test:e2e
|
|
||||||
|
|
||||||
# test coverage
|
|
||||||
$ npm run test:cov
|
|
||||||
```
|
|
||||||
|
|
||||||
## Deployment
|
|
||||||
|
|
||||||
When you're ready to deploy your NestJS application to production, there are some key steps you can take to ensure it runs as efficiently as possible. Check out the [deployment documentation](https://docs.nestjs.com/deployment) for more information.
|
|
||||||
|
|
||||||
If you are looking for a cloud-based platform to deploy your NestJS application, check out [Mau](https://mau.nestjs.com), our official platform for deploying NestJS applications on AWS. Mau makes deployment straightforward and fast, requiring just a few simple steps:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ npm install -g @nestjs/mau
|
|
||||||
$ mau deploy
|
|
||||||
```
|
|
||||||
|
|
||||||
With Mau, you can deploy your application in just a few clicks, allowing you to focus on building features rather than managing infrastructure.
|
|
||||||
|
|
||||||
## Resources
|
|
||||||
|
|
||||||
Check out a few resources that may come in handy when working with NestJS:
|
|
||||||
|
|
||||||
- Visit the [NestJS Documentation](https://docs.nestjs.com) to learn more about the framework.
|
|
||||||
- For questions and support, please visit our [Discord channel](https://discord.gg/G7Qnnhy).
|
|
||||||
- To dive deeper and get more hands-on experience, check out our official video [courses](https://courses.nestjs.com/).
|
|
||||||
- Deploy your application to AWS with the help of [NestJS Mau](https://mau.nestjs.com) in just a few clicks.
|
|
||||||
- Visualize your application graph and interact with the NestJS application in real-time using [NestJS Devtools](https://devtools.nestjs.com).
|
|
||||||
- Need help with your project (part-time to full-time)? Check out our official [enterprise support](https://enterprise.nestjs.com).
|
|
||||||
- To stay in the loop and get updates, follow us on [X](https://x.com/nestframework) and [LinkedIn](https://linkedin.com/company/nestjs).
|
|
||||||
- Looking for a job, or have a job to offer? Check out our official [Jobs board](https://jobs.nestjs.com).
|
|
||||||
|
|
||||||
## Support
|
|
||||||
|
|
||||||
Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support).
|
|
||||||
|
|
||||||
## Stay in touch
|
|
||||||
|
|
||||||
- Author - [Kamil Myśliwiec](https://twitter.com/kammysliwiec)
|
|
||||||
- Website - [https://nestjs.com](https://nestjs.com/)
|
|
||||||
- Twitter - [@nestframework](https://twitter.com/nestframework)
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
Nest is [MIT licensed](https://github.com/nestjs/nest/blob/master/LICENSE).
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
// @ts-check
|
|
||||||
import eslint from '@eslint/js';
|
|
||||||
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
|
|
||||||
import globals from 'globals';
|
|
||||||
import tseslint from 'typescript-eslint';
|
|
||||||
|
|
||||||
export default tseslint.config(
|
|
||||||
{
|
|
||||||
ignores: ['eslint.config.mjs'],
|
|
||||||
},
|
|
||||||
eslint.configs.recommended,
|
|
||||||
...tseslint.configs.recommendedTypeChecked,
|
|
||||||
eslintPluginPrettierRecommended,
|
|
||||||
{
|
|
||||||
languageOptions: {
|
|
||||||
globals: {
|
|
||||||
...globals.node,
|
|
||||||
...globals.jest,
|
|
||||||
},
|
|
||||||
sourceType: 'commonjs',
|
|
||||||
parserOptions: {
|
|
||||||
projectService: true,
|
|
||||||
tsconfigRootDir: import.meta.dirname,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
rules: {
|
|
||||||
'@typescript-eslint/no-explicit-any': 'off',
|
|
||||||
'@typescript-eslint/no-floating-promises': 'warn',
|
|
||||||
'@typescript-eslint/no-unsafe-argument': 'warn',
|
|
||||||
"prettier/prettier": ["error", { endOfLine: "auto" }],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
);
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "https://json.schemastore.org/nest-cli",
|
|
||||||
"collection": "@nestjs/schematics",
|
|
||||||
"sourceRoot": "src",
|
|
||||||
"compilerOptions": {
|
|
||||||
"deleteOutDir": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Generated
-11956
File diff suppressed because it is too large
Load Diff
@@ -1,87 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "server-nest-2",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"description": "",
|
|
||||||
"author": "",
|
|
||||||
"private": true,
|
|
||||||
"license": "UNLICENSED",
|
|
||||||
"scripts": {
|
|
||||||
"build": "nest build",
|
|
||||||
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
||||||
"start": "nest start",
|
|
||||||
"start:dev": "nest start --watch",
|
|
||||||
"start:debug": "nest start --debug --watch",
|
|
||||||
"start:prod": "node dist/main",
|
|
||||||
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
|
|
||||||
"test": "jest",
|
|
||||||
"test:watch": "jest --watch",
|
|
||||||
"test:cov": "jest --coverage",
|
|
||||||
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
|
|
||||||
"test:e2e": "jest --config ./test/jest-e2e.json"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@better-auth/oauth-provider": "^1.6.9",
|
|
||||||
"@better-auth/passkey": "^1.6.9",
|
|
||||||
"@hedystia/better-auth-typeorm": "^0.8.2",
|
|
||||||
"@nestjs/common": "^11.1.19",
|
|
||||||
"@nestjs/config": "^4.0.4",
|
|
||||||
"@nestjs/core": "^11.1.19",
|
|
||||||
"@nestjs/platform-express": "^11.1.19",
|
|
||||||
"@nestjs/platform-socket.io": "^11.1.19",
|
|
||||||
"@nestjs/throttler": "^6.5.0",
|
|
||||||
"@nestjs/typeorm": "^11.0.1",
|
|
||||||
"@nestjs/websockets": "^11.1.19",
|
|
||||||
"@thallesp/nestjs-better-auth": "^2.6.0",
|
|
||||||
"better-auth": "^1.6.9",
|
|
||||||
"better-sqlite3": "^12.9.0",
|
|
||||||
"csrf-csrf": "^4.0.3",
|
|
||||||
"helmet": "^8.1.0",
|
|
||||||
"mysql2": "^3.22.2",
|
|
||||||
"pg": "^8.20.0",
|
|
||||||
"reflect-metadata": "^0.2.2",
|
|
||||||
"rxjs": "^7.8.2",
|
|
||||||
"typeorm": "^0.3.28"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@eslint/eslintrc": "^3.2.0",
|
|
||||||
"@eslint/js": "^9.18.0",
|
|
||||||
"@nestjs/cli": "^11.0.0",
|
|
||||||
"@nestjs/schematics": "^11.0.0",
|
|
||||||
"@nestjs/testing": "^11.0.1",
|
|
||||||
"@types/express": "^5.0.0",
|
|
||||||
"@types/jest": "^30.0.0",
|
|
||||||
"@types/node": "^24.0.0",
|
|
||||||
"@types/supertest": "^7.0.0",
|
|
||||||
"eslint": "^9.18.0",
|
|
||||||
"eslint-config-prettier": "^10.0.1",
|
|
||||||
"eslint-plugin-prettier": "^5.2.2",
|
|
||||||
"globals": "^17.0.0",
|
|
||||||
"jest": "^30.0.0",
|
|
||||||
"prettier": "^3.4.2",
|
|
||||||
"source-map-support": "^0.5.21",
|
|
||||||
"supertest": "^7.0.0",
|
|
||||||
"ts-jest": "^29.2.5",
|
|
||||||
"ts-loader": "^9.5.2",
|
|
||||||
"ts-node": "^10.9.2",
|
|
||||||
"tsconfig-paths": "^4.2.0",
|
|
||||||
"typescript": "^5.7.3",
|
|
||||||
"typescript-eslint": "^8.20.0"
|
|
||||||
},
|
|
||||||
"jest": {
|
|
||||||
"moduleFileExtensions": [
|
|
||||||
"js",
|
|
||||||
"json",
|
|
||||||
"ts"
|
|
||||||
],
|
|
||||||
"rootDir": "src",
|
|
||||||
"testRegex": ".*\\.spec\\.ts$",
|
|
||||||
"transform": {
|
|
||||||
"^.+\\.(t|j)s$": "ts-jest"
|
|
||||||
},
|
|
||||||
"collectCoverageFrom": [
|
|
||||||
"**/*.(t|j)s"
|
|
||||||
],
|
|
||||||
"coverageDirectory": "../coverage",
|
|
||||||
"testEnvironment": "node"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
import authConfig from './config/auth.config.js';
|
|
||||||
import { Module } from '@nestjs/common';
|
|
||||||
import { ConfigModule, ConfigService } from '@nestjs/config';
|
|
||||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
|
||||||
import { AuthModule } from './auth/auth.module.js';
|
|
||||||
|
|
||||||
type SupportedDbType = 'mysql' | 'mariadb' | 'postgres' | 'sqlite';
|
|
||||||
|
|
||||||
function resolveDriver(type: SupportedDbType) {
|
|
||||||
switch (type) {
|
|
||||||
case 'mysql':
|
|
||||||
case 'mariadb':
|
|
||||||
return require('mysql2');
|
|
||||||
case 'postgres':
|
|
||||||
return require('pg');
|
|
||||||
case 'sqlite':
|
|
||||||
return require('better-sqlite3');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Module({
|
|
||||||
imports: [
|
|
||||||
ConfigModule.forRoot({ isGlobal: true, load: [authConfig] }),
|
|
||||||
AuthModule,
|
|
||||||
TypeOrmModule.forRootAsync({
|
|
||||||
imports: [ConfigModule],
|
|
||||||
useFactory: (config: ConfigService) => {
|
|
||||||
const type = config.get<SupportedDbType>('DB_TYPE', 'sqlite');
|
|
||||||
|
|
||||||
return {
|
|
||||||
type,
|
|
||||||
driver: resolveDriver(type),
|
|
||||||
host: config.get<string>('DB_HOST', 'localhost'),
|
|
||||||
port: config.get<number>('DB_PORT', 5432),
|
|
||||||
username: config.get<string>('DB_USER', 'usr'),
|
|
||||||
password: config.get<string>('DB_PASS', 'pwd'),
|
|
||||||
database: config.get<string>('DB_NAME', 'data/travel.db'),
|
|
||||||
autoLoadEntities: true,
|
|
||||||
synchronize: config.get<string>('NODE_ENV') !== 'production',
|
|
||||||
};
|
|
||||||
},
|
|
||||||
inject: [ConfigService],
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
})
|
|
||||||
export class AppModule {}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
import { betterAuth } from 'better-auth';
|
|
||||||
import { typeormAdapter } from '@hedystia/better-auth-typeorm';
|
|
||||||
import { DataSource } from 'typeorm';
|
|
||||||
import { AuthConfig } from '../config/auth.config.js';
|
|
||||||
|
|
||||||
export function createAuth(dataSource: DataSource, cfg: AuthConfig) {
|
|
||||||
return betterAuth({
|
|
||||||
database: typeormAdapter(dataSource, { debugLogs: cfg.debugLogs }),
|
|
||||||
secret: cfg.secret,
|
|
||||||
baseURL: cfg.baseURL,
|
|
||||||
basePath: '/api/auth',
|
|
||||||
trustedOrigins: cfg.frontendUrl ? [cfg.frontendUrl] : [],
|
|
||||||
advanced: {
|
|
||||||
cookies: { session_token: { name: 'trek_session' } },
|
|
||||||
useSecureCookies: cfg.cookieSecure,
|
|
||||||
},
|
|
||||||
emailAndPassword: { enabled: true },
|
|
||||||
plugins: [],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
import { betterAuth } from 'better-auth';
|
|
||||||
import { typeormAdapter } from '@hedystia/better-auth-typeorm';
|
|
||||||
import { magicLink } from 'better-auth/plugins/magic-link';
|
|
||||||
import { genericOAuth } from 'better-auth/plugins/generic-oauth';
|
|
||||||
import { jwt } from 'better-auth/plugins/jwt';
|
|
||||||
import { oauthProvider } from '@better-auth/oauth-provider';
|
|
||||||
import { passkey } from '@better-auth/passkey';
|
|
||||||
import { DataSource } from 'typeorm';
|
|
||||||
|
|
||||||
// Used only by `npx @better-auth/cli generate`.
|
|
||||||
// Not imported at runtime — auth.factory.ts uses the DI DataSource.
|
|
||||||
const dataSource = new DataSource({
|
|
||||||
type: 'better-sqlite3',
|
|
||||||
database: ':memory:',
|
|
||||||
});
|
|
||||||
|
|
||||||
export const auth = betterAuth({
|
|
||||||
baseURL: 'http://localhost:3000',
|
|
||||||
database: typeormAdapter(dataSource, {
|
|
||||||
entitiesDir: './src/models/entities/auth',
|
|
||||||
migrationsDir: './src/database/migrations',
|
|
||||||
}),
|
|
||||||
emailAndPassword: {
|
|
||||||
enabled: true,
|
|
||||||
requireEmailVerification: true,
|
|
||||||
sendVerificationEmail: async () => {},
|
|
||||||
sendResetPassword: async () => {},
|
|
||||||
},
|
|
||||||
emailVerification: {
|
|
||||||
sendVerificationEmail: async () => {},
|
|
||||||
},
|
|
||||||
plugins: [
|
|
||||||
jwt(),
|
|
||||||
magicLink({ sendMagicLink: async () => {} }),
|
|
||||||
genericOAuth({ config: [] }),
|
|
||||||
oauthProvider({ loginPage: '/login' }),
|
|
||||||
passkey(),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
import { Module } from '@nestjs/common';
|
|
||||||
import { ConfigModule, ConfigService } from '@nestjs/config';
|
|
||||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
|
||||||
import { AuthModule as BetterAuthNestModule } from '@thallesp/nestjs-better-auth';
|
|
||||||
import { DataSource } from 'typeorm';
|
|
||||||
import { createAuth } from './auth.factory.js';
|
|
||||||
import { AuthConfig } from '../config/auth.config.js';
|
|
||||||
import { User } from '../models/entities/auth/User.js';
|
|
||||||
import { Account } from '../models/entities/auth/Account.js';
|
|
||||||
import { Session } from '../models/entities/auth/Session.js';
|
|
||||||
import { Verification } from '../models/entities/auth/Verification.js';
|
|
||||||
import { Passkey } from '../models/entities/auth/Passkey.js';
|
|
||||||
import { Jwks } from '../models/entities/auth/Jwks.js';
|
|
||||||
import { OauthClient } from '../models/entities/auth/OauthClient.js';
|
|
||||||
import { OauthAccessToken } from '../models/entities/auth/OauthAccessToken.js';
|
|
||||||
import { OauthRefreshToken } from '../models/entities/auth/OauthRefreshToken.js';
|
|
||||||
import { OauthConsent } from '../models/entities/auth/OauthConsent.js';
|
|
||||||
|
|
||||||
@Module({
|
|
||||||
imports: [
|
|
||||||
TypeOrmModule.forFeature([
|
|
||||||
User,
|
|
||||||
Account,
|
|
||||||
Session,
|
|
||||||
Verification,
|
|
||||||
Passkey,
|
|
||||||
Jwks,
|
|
||||||
OauthClient,
|
|
||||||
OauthAccessToken,
|
|
||||||
OauthRefreshToken,
|
|
||||||
OauthConsent,
|
|
||||||
]),
|
|
||||||
BetterAuthNestModule.forRootAsync({
|
|
||||||
imports: [ConfigModule],
|
|
||||||
inject: [DataSource, ConfigService],
|
|
||||||
useFactory: (ds: DataSource, config: ConfigService) => ({
|
|
||||||
auth: createAuth(ds, config.get<AuthConfig>('auth')!),
|
|
||||||
}),
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
exports: [BetterAuthNestModule],
|
|
||||||
})
|
|
||||||
export class AuthModule {}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
import { registerAs } from '@nestjs/config';
|
|
||||||
import { boolean } from 'better-auth';
|
|
||||||
|
|
||||||
export interface AuthConfig {
|
|
||||||
secret: string;
|
|
||||||
baseURL: string;
|
|
||||||
frontendUrl: string | undefined;
|
|
||||||
cookieSecure: boolean;
|
|
||||||
debugLogs: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default registerAs(
|
|
||||||
'auth',
|
|
||||||
(): AuthConfig => ({
|
|
||||||
secret: process.env.BETTER_AUTH_SECRET ?? 'changeme',
|
|
||||||
baseURL: process.env.BETTER_AUTH_URL ?? 'http://localhost:3000',
|
|
||||||
frontendUrl: process.env.BASE_URL,
|
|
||||||
cookieSecure:
|
|
||||||
process.env.COOKIE_SECURE === 'true' &&
|
|
||||||
process.env.NODE_ENV === 'production' &&
|
|
||||||
process.env.BASE_URL?.startsWith('https') === true,
|
|
||||||
debugLogs:
|
|
||||||
process.env.BETTER_AUTH_DEBUG_LOGS === 'true' ||
|
|
||||||
process.env.NODE_ENV === 'development',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateAccount1777216318138 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'account',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'accountId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'providerId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'accessToken',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'refreshToken',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'idToken',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'accessTokenExpiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'refreshTokenExpiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scope',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'password',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'account',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'account_userId_idx',
|
|
||||||
columnNames: ['userId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'account',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('account');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateSession1777216318138 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'session',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'token',
|
|
||||||
type: 'text',
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'ipAddress',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userAgent',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'session',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'session_userId_idx',
|
|
||||||
columnNames: ['userId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'session',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('session');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateUser1777216318138 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'user',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'name',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'email',
|
|
||||||
type: 'text',
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'emailVerified',
|
|
||||||
type: 'boolean',
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'image',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('user');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateVerification1777216318138 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'verification',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'identifier',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'value',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'verification',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'verification_identifier_idx',
|
|
||||||
columnNames: ['identifier'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('verification');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateAccount1777217712285 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'account',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'accountId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'providerId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'accessToken',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'refreshToken',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'idToken',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'accessTokenExpiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'refreshTokenExpiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scope',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'password',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'account',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'account_userId_idx',
|
|
||||||
columnNames: ['userId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'account',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('account');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateOauthAccessToken1777217712285 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'oauthAccessToken',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'accessToken',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'refreshToken',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'accessTokenExpiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'refreshTokenExpiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scopes',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'oauthAccessToken',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'oauthAccessToken_clientId_idx',
|
|
||||||
columnNames: ['clientId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthAccessToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['clientId'],
|
|
||||||
referencedTableName: 'oauthApplication',
|
|
||||||
referencedColumnNames: ['clientId'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'oauthAccessToken',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'oauthAccessToken_userId_idx',
|
|
||||||
columnNames: ['userId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthAccessToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('oauthAccessToken');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateOauthApplication1777217712285 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'oauthApplication',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'name',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'icon',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'metadata',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientSecret',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'redirectUrls',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'type',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'disabled',
|
|
||||||
type: 'boolean',
|
|
||||||
isNullable: true,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'oauthApplication',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'oauthApplication_userId_idx',
|
|
||||||
columnNames: ['userId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthApplication',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('oauthApplication');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateOauthConsent1777217712285 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'oauthConsent',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scopes',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'consentGiven',
|
|
||||||
type: 'boolean',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'oauthConsent',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'oauthConsent_clientId_idx',
|
|
||||||
columnNames: ['clientId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthConsent',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['clientId'],
|
|
||||||
referencedTableName: 'oauthApplication',
|
|
||||||
referencedColumnNames: ['clientId'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'oauthConsent',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'oauthConsent_userId_idx',
|
|
||||||
columnNames: ['userId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthConsent',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('oauthConsent');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreatePasskey1777217712285 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'passkey',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'name',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'publicKey',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'credentialID',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'counter',
|
|
||||||
type: 'integer',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'deviceType',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'backedUp',
|
|
||||||
type: 'boolean',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'transports',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'aaguid',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'passkey',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'passkey_userId_idx',
|
|
||||||
columnNames: ['userId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'passkey',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'passkey',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'passkey_credentialID_idx',
|
|
||||||
columnNames: ['credentialID'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('passkey');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateSession1777217712285 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'session',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'token',
|
|
||||||
type: 'text',
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'ipAddress',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userAgent',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'session',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'session_userId_idx',
|
|
||||||
columnNames: ['userId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'session',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('session');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateUser1777217712285 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'user',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'name',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'email',
|
|
||||||
type: 'text',
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'emailVerified',
|
|
||||||
type: 'boolean',
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'image',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('user');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateVerification1777217712285 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'verification',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'identifier',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'value',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'verification',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'verification_identifier_idx',
|
|
||||||
columnNames: ['identifier'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('verification');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateAccount1777217820713 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'account',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'accountId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'providerId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'accessToken',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'refreshToken',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'idToken',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'accessTokenExpiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'refreshTokenExpiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scope',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'password',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'account',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'account_userId_idx',
|
|
||||||
columnNames: ['userId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'account',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('account');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,113 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateOauthAccessToken1777217820713 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'oauthAccessToken',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'token',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'sessionId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'referenceId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'refreshId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scopes',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthAccessToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['clientId'],
|
|
||||||
referencedTableName: 'oauthClient',
|
|
||||||
referencedColumnNames: ['clientId'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthAccessToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['sessionId'],
|
|
||||||
referencedTableName: 'session',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'SET NULL',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthAccessToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthAccessToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['refreshId'],
|
|
||||||
referencedTableName: 'oauthRefreshToken',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('oauthAccessToken');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,184 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateOauthClient1777217820713 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'oauthClient',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientId',
|
|
||||||
type: 'text',
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientSecret',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'disabled',
|
|
||||||
type: 'boolean',
|
|
||||||
isNullable: true,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'skipConsent',
|
|
||||||
type: 'boolean',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'enableEndSession',
|
|
||||||
type: 'boolean',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'subjectType',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scopes',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'name',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'uri',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'icon',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'contacts',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'tos',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'policy',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'softwareId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'softwareVersion',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'softwareStatement',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'redirectUris',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'postLogoutRedirectUris',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'tokenEndpointAuthMethod',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'grantTypes',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'responseTypes',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'public',
|
|
||||||
type: 'boolean',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'type',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'requirePKCE',
|
|
||||||
type: 'boolean',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'referenceId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'metadata',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthClient',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('oauthClient');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateOauthConsent1777217820713 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'oauthConsent',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'referenceId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scopes',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthConsent',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['clientId'],
|
|
||||||
referencedTableName: 'oauthClient',
|
|
||||||
referencedColumnNames: ['clientId'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthConsent',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('oauthConsent');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateOauthRefreshToken1777217820713 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'oauthRefreshToken',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'token',
|
|
||||||
type: 'text',
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'sessionId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'referenceId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'revoked',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'authTime',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scopes',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthRefreshToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['clientId'],
|
|
||||||
referencedTableName: 'oauthClient',
|
|
||||||
referencedColumnNames: ['clientId'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthRefreshToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['sessionId'],
|
|
||||||
referencedTableName: 'session',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'SET NULL',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthRefreshToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('oauthRefreshToken');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreatePasskey1777217820713 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'passkey',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'name',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'publicKey',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'credentialID',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'counter',
|
|
||||||
type: 'integer',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'deviceType',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'backedUp',
|
|
||||||
type: 'boolean',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'transports',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'aaguid',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'passkey',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'passkey_userId_idx',
|
|
||||||
columnNames: ['userId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'passkey',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'passkey',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'passkey_credentialID_idx',
|
|
||||||
columnNames: ['credentialID'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('passkey');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateSession1777217820713 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'session',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'token',
|
|
||||||
type: 'text',
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'ipAddress',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userAgent',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'session',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'session_userId_idx',
|
|
||||||
columnNames: ['userId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'session',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('session');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateUser1777217820713 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'user',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'name',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'email',
|
|
||||||
type: 'text',
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'emailVerified',
|
|
||||||
type: 'boolean',
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'image',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('user');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateVerification1777217820713 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'verification',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'identifier',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'value',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'verification',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'verification_identifier_idx',
|
|
||||||
columnNames: ['identifier'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('verification');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateAccount1777217882945 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'account',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'accountId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'providerId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'accessToken',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'refreshToken',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'idToken',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'accessTokenExpiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'refreshTokenExpiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scope',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'password',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'account',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'account_userId_idx',
|
|
||||||
columnNames: ['userId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'account',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('account');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateJwks1777217882945 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'jwks',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'publicKey',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'privateKey',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('jwks');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,113 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateOauthAccessToken1777217882945 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'oauthAccessToken',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'token',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'sessionId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'referenceId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'refreshId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scopes',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthAccessToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['clientId'],
|
|
||||||
referencedTableName: 'oauthClient',
|
|
||||||
referencedColumnNames: ['clientId'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthAccessToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['sessionId'],
|
|
||||||
referencedTableName: 'session',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'SET NULL',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthAccessToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthAccessToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['refreshId'],
|
|
||||||
referencedTableName: 'oauthRefreshToken',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('oauthAccessToken');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,184 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateOauthClient1777217882945 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'oauthClient',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientId',
|
|
||||||
type: 'text',
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientSecret',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'disabled',
|
|
||||||
type: 'boolean',
|
|
||||||
isNullable: true,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'skipConsent',
|
|
||||||
type: 'boolean',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'enableEndSession',
|
|
||||||
type: 'boolean',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'subjectType',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scopes',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'name',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'uri',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'icon',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'contacts',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'tos',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'policy',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'softwareId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'softwareVersion',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'softwareStatement',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'redirectUris',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'postLogoutRedirectUris',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'tokenEndpointAuthMethod',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'grantTypes',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'responseTypes',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'public',
|
|
||||||
type: 'boolean',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'type',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'requirePKCE',
|
|
||||||
type: 'boolean',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'referenceId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'metadata',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthClient',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('oauthClient');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateOauthConsent1777217882945 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'oauthConsent',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'referenceId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scopes',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthConsent',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['clientId'],
|
|
||||||
referencedTableName: 'oauthClient',
|
|
||||||
referencedColumnNames: ['clientId'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthConsent',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('oauthConsent');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateOauthRefreshToken1777217882945 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'oauthRefreshToken',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'token',
|
|
||||||
type: 'text',
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'sessionId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'referenceId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'revoked',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'authTime',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scopes',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthRefreshToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['clientId'],
|
|
||||||
referencedTableName: 'oauthClient',
|
|
||||||
referencedColumnNames: ['clientId'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthRefreshToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['sessionId'],
|
|
||||||
referencedTableName: 'session',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'SET NULL',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthRefreshToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('oauthRefreshToken');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreatePasskey1777217882945 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'passkey',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'name',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'publicKey',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'credentialID',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'counter',
|
|
||||||
type: 'integer',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'deviceType',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'backedUp',
|
|
||||||
type: 'boolean',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'transports',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'aaguid',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'passkey',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'passkey_userId_idx',
|
|
||||||
columnNames: ['userId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'passkey',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'passkey',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'passkey_credentialID_idx',
|
|
||||||
columnNames: ['credentialID'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('passkey');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateSession1777217882945 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'session',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'token',
|
|
||||||
type: 'text',
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'ipAddress',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userAgent',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'session',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'session_userId_idx',
|
|
||||||
columnNames: ['userId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'session',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('session');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateUser1777217882945 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'user',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'name',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'email',
|
|
||||||
type: 'text',
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'emailVerified',
|
|
||||||
type: 'boolean',
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'image',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('user');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateVerification1777217882945 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'verification',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'identifier',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'value',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'verification',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'verification_identifier_idx',
|
|
||||||
columnNames: ['identifier'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('verification');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateAccount1777217895075 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'account',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'accountId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'providerId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'accessToken',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'refreshToken',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'idToken',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'accessTokenExpiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'refreshTokenExpiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scope',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'password',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'account',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'account_userId_idx',
|
|
||||||
columnNames: ['userId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'account',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('account');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateJwks1777217895075 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'jwks',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'publicKey',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'privateKey',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('jwks');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,113 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateOauthAccessToken1777217895075 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'oauthAccessToken',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'token',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'sessionId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'referenceId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'refreshId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scopes',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthAccessToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['clientId'],
|
|
||||||
referencedTableName: 'oauthClient',
|
|
||||||
referencedColumnNames: ['clientId'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthAccessToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['sessionId'],
|
|
||||||
referencedTableName: 'session',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'SET NULL',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthAccessToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthAccessToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['refreshId'],
|
|
||||||
referencedTableName: 'oauthRefreshToken',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('oauthAccessToken');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,184 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateOauthClient1777217895075 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'oauthClient',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientId',
|
|
||||||
type: 'text',
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientSecret',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'disabled',
|
|
||||||
type: 'boolean',
|
|
||||||
isNullable: true,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'skipConsent',
|
|
||||||
type: 'boolean',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'enableEndSession',
|
|
||||||
type: 'boolean',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'subjectType',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scopes',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'name',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'uri',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'icon',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'contacts',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'tos',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'policy',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'softwareId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'softwareVersion',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'softwareStatement',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'redirectUris',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'postLogoutRedirectUris',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'tokenEndpointAuthMethod',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'grantTypes',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'responseTypes',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'public',
|
|
||||||
type: 'boolean',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'type',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'requirePKCE',
|
|
||||||
type: 'boolean',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'referenceId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'metadata',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthClient',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('oauthClient');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateOauthConsent1777217895075 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'oauthConsent',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'referenceId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scopes',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthConsent',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['clientId'],
|
|
||||||
referencedTableName: 'oauthClient',
|
|
||||||
referencedColumnNames: ['clientId'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthConsent',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('oauthConsent');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateOauthRefreshToken1777217895075 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'oauthRefreshToken',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'token',
|
|
||||||
type: 'text',
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'clientId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'sessionId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'referenceId',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'revoked',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'authTime',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'scopes',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthRefreshToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['clientId'],
|
|
||||||
referencedTableName: 'oauthClient',
|
|
||||||
referencedColumnNames: ['clientId'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthRefreshToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['sessionId'],
|
|
||||||
referencedTableName: 'session',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'SET NULL',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'oauthRefreshToken',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('oauthRefreshToken');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreatePasskey1777217895075 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'passkey',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'name',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'publicKey',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'credentialID',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'counter',
|
|
||||||
type: 'integer',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'deviceType',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'backedUp',
|
|
||||||
type: 'boolean',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'transports',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'aaguid',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'passkey',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'passkey_userId_idx',
|
|
||||||
columnNames: ['userId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'passkey',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'passkey',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'passkey_credentialID_idx',
|
|
||||||
columnNames: ['credentialID'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('passkey');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateSession1777217895075 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'session',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'token',
|
|
||||||
type: 'text',
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'ipAddress',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userAgent',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'userId',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'session',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'session_userId_idx',
|
|
||||||
columnNames: ['userId'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
'session',
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ['userId'],
|
|
||||||
referencedTableName: 'user',
|
|
||||||
referencedColumnNames: ['id'],
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('session');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateUser1777217895075 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'user',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'name',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'email',
|
|
||||||
type: 'text',
|
|
||||||
isUnique: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'emailVerified',
|
|
||||||
type: 'boolean',
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'image',
|
|
||||||
type: 'text',
|
|
||||||
isNullable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('user');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
import {
|
|
||||||
type MigrationInterface,
|
|
||||||
type QueryRunner,
|
|
||||||
Table,
|
|
||||||
TableColumn,
|
|
||||||
TableForeignKey,
|
|
||||||
TableIndex,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
export class CreateVerification1777217895075 implements MigrationInterface {
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: 'verification',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: 'id',
|
|
||||||
type: 'text',
|
|
||||||
isPrimary: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'identifier',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'value',
|
|
||||||
type: 'text',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'expiresAt',
|
|
||||||
type: 'datetime',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'createdAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'updatedAt',
|
|
||||||
type: 'datetime',
|
|
||||||
default: 'CURRENT_TIMESTAMP',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createIndex(
|
|
||||||
'verification',
|
|
||||||
new TableIndex({
|
|
||||||
name: 'verification_identifier_idx',
|
|
||||||
columnNames: ['identifier'],
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable('verification');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
import { NestFactory } from '@nestjs/core';
|
|
||||||
import { AppModule } from './app.module';
|
|
||||||
|
|
||||||
async function bootstrap() {
|
|
||||||
const app = await NestFactory.create(AppModule, { bodyParser: false });
|
|
||||||
await app.listen(process.env.PORT ?? 3001);
|
|
||||||
}
|
|
||||||
bootstrap();
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
import { Column, Entity, JoinColumn, ManyToOne } from 'typeorm';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
import { SqliteUsers } from '../old-entities/SqliteUsers';
|
|
||||||
|
|
||||||
@Entity('bucket_list')
|
|
||||||
export class BucketList extends IntBaseEntity {
|
|
||||||
@Column({ name: 'name' })
|
|
||||||
name: string;
|
|
||||||
|
|
||||||
@Column({ name: 'lat', nullable: true })
|
|
||||||
lat: number | null;
|
|
||||||
|
|
||||||
@Column({ name: 'lng', nullable: true })
|
|
||||||
lng: number | null;
|
|
||||||
|
|
||||||
@Column({ name: 'country_code', nullable: true })
|
|
||||||
countryCode: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'notes', nullable: true })
|
|
||||||
notes: string | null;
|
|
||||||
|
|
||||||
@Column({
|
|
||||||
name: 'target_date',
|
|
||||||
nullable: true,
|
|
||||||
default: null,
|
|
||||||
})
|
|
||||||
targetDate: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => SqliteUsers, (users) => users.bucketLists, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'user_id', referencedColumnName: 'id' }])
|
|
||||||
user: SqliteUsers;
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
import { Column, Entity, JoinColumn, ManyToOne } from 'typeorm';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
import { SqliteUsers } from '../old-entities/SqliteUsers';
|
|
||||||
|
|
||||||
@Entity('visited_countries')
|
|
||||||
export class VisitedCountries extends IntBaseEntity {
|
|
||||||
@Column('text', { name: 'country_code' })
|
|
||||||
countryCode: string;
|
|
||||||
|
|
||||||
@ManyToOne(() => SqliteUsers, (users) => users.visitedCountries, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'user_id', referencedColumnName: 'id' }])
|
|
||||||
user: SqliteUsers;
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
import { Column, Entity, Index, JoinColumn, ManyToOne } from 'typeorm';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
import { SqliteUsers } from '../old-entities/SqliteUsers';
|
|
||||||
|
|
||||||
@Index('idx_visited_regions_country', ['countryCode'], {})
|
|
||||||
@Entity('visited_regions')
|
|
||||||
export class VisitedRegions extends IntBaseEntity {
|
|
||||||
@Column({ name: 'region_code' })
|
|
||||||
regionCode: string;
|
|
||||||
|
|
||||||
@Column({ name: 'region_name' })
|
|
||||||
regionName: string;
|
|
||||||
|
|
||||||
@Column({ name: 'country_code' })
|
|
||||||
countryCode: string;
|
|
||||||
|
|
||||||
@ManyToOne(() => SqliteUsers, (users) => users.visitedRegions, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'user_id', referencedColumnName: 'id' }])
|
|
||||||
user: SqliteUsers;
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
/**
|
|
||||||
* AUTOGENERATED
|
|
||||||
*/
|
|
||||||
import {
|
|
||||||
Column,
|
|
||||||
Entity,
|
|
||||||
Index,
|
|
||||||
JoinColumn,
|
|
||||||
ManyToOne,
|
|
||||||
PrimaryColumn,
|
|
||||||
} from 'typeorm';
|
|
||||||
import { User } from './User';
|
|
||||||
|
|
||||||
@Entity('account')
|
|
||||||
export class Account {
|
|
||||||
@PrimaryColumn('text')
|
|
||||||
id: string;
|
|
||||||
|
|
||||||
@Column('text', { name: 'accountId' })
|
|
||||||
accountId: string;
|
|
||||||
|
|
||||||
@Column('text', { name: 'providerId' })
|
|
||||||
providerId: string;
|
|
||||||
|
|
||||||
@Index('account_userId_idx')
|
|
||||||
@Column('text', { name: 'userId' })
|
|
||||||
userId: string;
|
|
||||||
|
|
||||||
@ManyToOne(() => User, { onDelete: 'CASCADE', nullable: false })
|
|
||||||
@JoinColumn({ name: 'userId', referencedColumnName: 'id' })
|
|
||||||
user: User;
|
|
||||||
|
|
||||||
@Column('text', { name: 'accessToken', nullable: true })
|
|
||||||
accessToken: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'refreshToken', nullable: true })
|
|
||||||
refreshToken: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'idToken', nullable: true })
|
|
||||||
idToken: string | null;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'accessTokenExpiresAt', nullable: true })
|
|
||||||
accessTokenExpiresAt: Date | null;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'refreshTokenExpiresAt', nullable: true })
|
|
||||||
refreshTokenExpiresAt: Date | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'scope', nullable: true })
|
|
||||||
scope: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'password', nullable: true })
|
|
||||||
password: string | null;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'createdAt' })
|
|
||||||
createdAt: Date;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'updatedAt' })
|
|
||||||
updatedAt: Date;
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
/**
|
|
||||||
* AUTOGENERATED
|
|
||||||
*/
|
|
||||||
import { Column, Entity, PrimaryColumn } from 'typeorm';
|
|
||||||
|
|
||||||
@Entity('jwks')
|
|
||||||
export class Jwks {
|
|
||||||
@PrimaryColumn('text')
|
|
||||||
id: string;
|
|
||||||
|
|
||||||
@Column('text', { name: 'publicKey' })
|
|
||||||
publicKey: string;
|
|
||||||
|
|
||||||
@Column('text', { name: 'privateKey' })
|
|
||||||
privateKey: string;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'createdAt' })
|
|
||||||
createdAt: Date;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'expiresAt', nullable: true })
|
|
||||||
expiresAt: Date | null;
|
|
||||||
}
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
/**
|
|
||||||
* AUTOGENERATED
|
|
||||||
*/
|
|
||||||
import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from 'typeorm';
|
|
||||||
import { OauthClient } from './OauthClient';
|
|
||||||
import { OauthRefreshToken } from './OauthRefreshToken';
|
|
||||||
import { Session } from './Session';
|
|
||||||
import { User } from './User';
|
|
||||||
|
|
||||||
@Entity('oauthAccessToken')
|
|
||||||
export class OauthAccessToken {
|
|
||||||
@PrimaryColumn('text')
|
|
||||||
id: string;
|
|
||||||
|
|
||||||
@Column('text', { name: 'token', nullable: true, unique: true })
|
|
||||||
token: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'clientId' })
|
|
||||||
clientId: string;
|
|
||||||
|
|
||||||
@ManyToOne(() => OauthClient, { onDelete: 'CASCADE', nullable: false })
|
|
||||||
@JoinColumn({ name: 'clientId', referencedColumnName: 'clientId' })
|
|
||||||
client: OauthClient;
|
|
||||||
|
|
||||||
@Column('text', { name: 'sessionId', nullable: true })
|
|
||||||
sessionId: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => Session, { onDelete: 'SET NULL', nullable: true })
|
|
||||||
@JoinColumn({ name: 'sessionId', referencedColumnName: 'id' })
|
|
||||||
session?: Session;
|
|
||||||
|
|
||||||
@Column('text', { name: 'userId', nullable: true })
|
|
||||||
userId: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => User, { onDelete: 'CASCADE', nullable: true })
|
|
||||||
@JoinColumn({ name: 'userId', referencedColumnName: 'id' })
|
|
||||||
user?: User;
|
|
||||||
|
|
||||||
@Column('text', { name: 'referenceId', nullable: true })
|
|
||||||
referenceId: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'refreshId', nullable: true })
|
|
||||||
refreshId: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => OauthRefreshToken, { onDelete: 'CASCADE', nullable: true })
|
|
||||||
@JoinColumn({ name: 'refreshId', referencedColumnName: 'id' })
|
|
||||||
refresh?: OauthRefreshToken;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'expiresAt', nullable: true })
|
|
||||||
expiresAt: Date | null;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'createdAt', nullable: true })
|
|
||||||
createdAt: Date | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'scopes' })
|
|
||||||
scopes: string;
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
/**
|
|
||||||
* AUTOGENERATED
|
|
||||||
*/
|
|
||||||
import {
|
|
||||||
Column,
|
|
||||||
Entity,
|
|
||||||
Index,
|
|
||||||
JoinColumn,
|
|
||||||
ManyToOne,
|
|
||||||
PrimaryColumn,
|
|
||||||
} from 'typeorm';
|
|
||||||
import { User } from './User';
|
|
||||||
|
|
||||||
@Entity('oauthApplication')
|
|
||||||
export class OauthApplication {
|
|
||||||
@PrimaryColumn('text')
|
|
||||||
id: string;
|
|
||||||
|
|
||||||
@Column('text', { name: 'name', nullable: true })
|
|
||||||
name: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'icon', nullable: true })
|
|
||||||
icon: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'metadata', nullable: true })
|
|
||||||
metadata: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'clientId', nullable: true, unique: true })
|
|
||||||
clientId: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'clientSecret', nullable: true })
|
|
||||||
clientSecret: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'redirectUrls', nullable: true })
|
|
||||||
redirectUrls: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'type', nullable: true })
|
|
||||||
type: string | null;
|
|
||||||
|
|
||||||
@Column('boolean', { name: 'disabled', nullable: true, default: false })
|
|
||||||
disabled: boolean | null;
|
|
||||||
|
|
||||||
@Index('oauthApplication_userId_idx')
|
|
||||||
@Column('text', { name: 'userId', nullable: true })
|
|
||||||
userId: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => User, { onDelete: 'CASCADE', nullable: true })
|
|
||||||
@JoinColumn({ name: 'userId', referencedColumnName: 'id' })
|
|
||||||
user?: User;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'createdAt', nullable: true })
|
|
||||||
createdAt: Date | null;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'updatedAt', nullable: true })
|
|
||||||
updatedAt: Date | null;
|
|
||||||
}
|
|
||||||
@@ -1,102 +0,0 @@
|
|||||||
/**
|
|
||||||
* AUTOGENERATED
|
|
||||||
*/
|
|
||||||
import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from 'typeorm';
|
|
||||||
import { User } from './User';
|
|
||||||
|
|
||||||
@Entity('oauthClient')
|
|
||||||
export class OauthClient {
|
|
||||||
@PrimaryColumn('text')
|
|
||||||
id: string;
|
|
||||||
|
|
||||||
@Column('text', { name: 'clientId', unique: true })
|
|
||||||
clientId: string;
|
|
||||||
|
|
||||||
@Column('text', { name: 'clientSecret', nullable: true })
|
|
||||||
clientSecret: string | null;
|
|
||||||
|
|
||||||
@Column('boolean', { name: 'disabled', nullable: true, default: false })
|
|
||||||
disabled: boolean | null;
|
|
||||||
|
|
||||||
@Column('boolean', { name: 'skipConsent', nullable: true })
|
|
||||||
skipConsent: boolean | null;
|
|
||||||
|
|
||||||
@Column('boolean', { name: 'enableEndSession', nullable: true })
|
|
||||||
enableEndSession: boolean | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'subjectType', nullable: true })
|
|
||||||
subjectType: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'scopes', nullable: true })
|
|
||||||
scopes: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'userId', nullable: true })
|
|
||||||
userId: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => User, { onDelete: 'CASCADE', nullable: true })
|
|
||||||
@JoinColumn({ name: 'userId', referencedColumnName: 'id' })
|
|
||||||
user?: User;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'createdAt', nullable: true })
|
|
||||||
createdAt: Date | null;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'updatedAt', nullable: true })
|
|
||||||
updatedAt: Date | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'name', nullable: true })
|
|
||||||
name: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'uri', nullable: true })
|
|
||||||
uri: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'icon', nullable: true })
|
|
||||||
icon: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'contacts', nullable: true })
|
|
||||||
contacts: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'tos', nullable: true })
|
|
||||||
tos: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'policy', nullable: true })
|
|
||||||
policy: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'softwareId', nullable: true })
|
|
||||||
softwareId: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'softwareVersion', nullable: true })
|
|
||||||
softwareVersion: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'softwareStatement', nullable: true })
|
|
||||||
softwareStatement: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'redirectUris' })
|
|
||||||
redirectUris: string;
|
|
||||||
|
|
||||||
@Column('text', { name: 'postLogoutRedirectUris', nullable: true })
|
|
||||||
postLogoutRedirectUris: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'tokenEndpointAuthMethod', nullable: true })
|
|
||||||
tokenEndpointAuthMethod: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'grantTypes', nullable: true })
|
|
||||||
grantTypes: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'responseTypes', nullable: true })
|
|
||||||
responseTypes: string | null;
|
|
||||||
|
|
||||||
@Column('boolean', { name: 'public', nullable: true })
|
|
||||||
public: boolean | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'type', nullable: true })
|
|
||||||
type: string | null;
|
|
||||||
|
|
||||||
@Column('boolean', { name: 'requirePKCE', nullable: true })
|
|
||||||
requirePKCE: boolean | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'referenceId', nullable: true })
|
|
||||||
referenceId: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'metadata', nullable: true })
|
|
||||||
metadata: string | null;
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
/**
|
|
||||||
* AUTOGENERATED
|
|
||||||
*/
|
|
||||||
import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from 'typeorm';
|
|
||||||
import { OauthClient } from './OauthClient';
|
|
||||||
import { User } from './User';
|
|
||||||
|
|
||||||
@Entity('oauthConsent')
|
|
||||||
export class OauthConsent {
|
|
||||||
@PrimaryColumn('text')
|
|
||||||
id: string;
|
|
||||||
|
|
||||||
@Column('text', { name: 'clientId' })
|
|
||||||
clientId: string;
|
|
||||||
|
|
||||||
@ManyToOne(() => OauthClient, { onDelete: 'CASCADE', nullable: false })
|
|
||||||
@JoinColumn({ name: 'clientId', referencedColumnName: 'clientId' })
|
|
||||||
client: OauthClient;
|
|
||||||
|
|
||||||
@Column('text', { name: 'userId', nullable: true })
|
|
||||||
userId: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => User, { onDelete: 'CASCADE', nullable: true })
|
|
||||||
@JoinColumn({ name: 'userId', referencedColumnName: 'id' })
|
|
||||||
user?: User;
|
|
||||||
|
|
||||||
@Column('text', { name: 'referenceId', nullable: true })
|
|
||||||
referenceId: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'scopes' })
|
|
||||||
scopes: string;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'createdAt', nullable: true })
|
|
||||||
createdAt: Date | null;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'updatedAt', nullable: true })
|
|
||||||
updatedAt: Date | null;
|
|
||||||
}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
/**
|
|
||||||
* AUTOGENERATED
|
|
||||||
*/
|
|
||||||
import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from 'typeorm';
|
|
||||||
import { OauthClient } from './OauthClient';
|
|
||||||
import { Session } from './Session';
|
|
||||||
import { User } from './User';
|
|
||||||
|
|
||||||
@Entity('oauthRefreshToken')
|
|
||||||
export class OauthRefreshToken {
|
|
||||||
@PrimaryColumn('text')
|
|
||||||
id: string;
|
|
||||||
|
|
||||||
@Column('text', { name: 'token', unique: true })
|
|
||||||
token: string;
|
|
||||||
|
|
||||||
@Column('text', { name: 'clientId' })
|
|
||||||
clientId: string;
|
|
||||||
|
|
||||||
@ManyToOne(() => OauthClient, { onDelete: 'CASCADE', nullable: false })
|
|
||||||
@JoinColumn({ name: 'clientId', referencedColumnName: 'clientId' })
|
|
||||||
client: OauthClient;
|
|
||||||
|
|
||||||
@Column('text', { name: 'sessionId', nullable: true })
|
|
||||||
sessionId: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => Session, { onDelete: 'SET NULL', nullable: true })
|
|
||||||
@JoinColumn({ name: 'sessionId', referencedColumnName: 'id' })
|
|
||||||
session?: Session;
|
|
||||||
|
|
||||||
@Column('text', { name: 'userId' })
|
|
||||||
userId: string;
|
|
||||||
|
|
||||||
@ManyToOne(() => User, { onDelete: 'CASCADE', nullable: false })
|
|
||||||
@JoinColumn({ name: 'userId', referencedColumnName: 'id' })
|
|
||||||
user: User;
|
|
||||||
|
|
||||||
@Column('text', { name: 'referenceId', nullable: true })
|
|
||||||
referenceId: string | null;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'expiresAt', nullable: true })
|
|
||||||
expiresAt: Date | null;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'createdAt', nullable: true })
|
|
||||||
createdAt: Date | null;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'revoked', nullable: true })
|
|
||||||
revoked: Date | null;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'authTime', nullable: true })
|
|
||||||
authTime: Date | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'scopes' })
|
|
||||||
scopes: string;
|
|
||||||
}
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
/**
|
|
||||||
* AUTOGENERATED
|
|
||||||
*/
|
|
||||||
import {
|
|
||||||
Column,
|
|
||||||
Entity,
|
|
||||||
Index,
|
|
||||||
JoinColumn,
|
|
||||||
ManyToOne,
|
|
||||||
PrimaryColumn,
|
|
||||||
} from 'typeorm';
|
|
||||||
import { User } from './User';
|
|
||||||
|
|
||||||
@Entity('passkey')
|
|
||||||
export class Passkey {
|
|
||||||
@PrimaryColumn('text')
|
|
||||||
id: string;
|
|
||||||
|
|
||||||
@Column('text', { name: 'name', nullable: true })
|
|
||||||
name: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'publicKey' })
|
|
||||||
publicKey: string;
|
|
||||||
|
|
||||||
@Index('passkey_userId_idx')
|
|
||||||
@Column('text', { name: 'userId' })
|
|
||||||
userId: string;
|
|
||||||
|
|
||||||
@ManyToOne(() => User, { onDelete: 'CASCADE', nullable: false })
|
|
||||||
@JoinColumn({ name: 'userId', referencedColumnName: 'id' })
|
|
||||||
user: User;
|
|
||||||
|
|
||||||
@Index('passkey_credentialID_idx')
|
|
||||||
@Column('text', { name: 'credentialID' })
|
|
||||||
credentialID: string;
|
|
||||||
|
|
||||||
@Column('integer', { name: 'counter' })
|
|
||||||
counter: number;
|
|
||||||
|
|
||||||
@Column('text', { name: 'deviceType' })
|
|
||||||
deviceType: string;
|
|
||||||
|
|
||||||
@Column('boolean', { name: 'backedUp' })
|
|
||||||
backedUp: boolean;
|
|
||||||
|
|
||||||
@Column('text', { name: 'transports', nullable: true })
|
|
||||||
transports: string | null;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'createdAt', nullable: true })
|
|
||||||
createdAt: Date | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'aaguid', nullable: true })
|
|
||||||
aaguid: string | null;
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
/**
|
|
||||||
* AUTOGENERATED
|
|
||||||
*/
|
|
||||||
import {
|
|
||||||
Column,
|
|
||||||
Entity,
|
|
||||||
Index,
|
|
||||||
JoinColumn,
|
|
||||||
ManyToOne,
|
|
||||||
PrimaryColumn,
|
|
||||||
} from 'typeorm';
|
|
||||||
import { User } from './User';
|
|
||||||
|
|
||||||
@Entity('session')
|
|
||||||
export class Session {
|
|
||||||
@PrimaryColumn('text')
|
|
||||||
id: string;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'expiresAt' })
|
|
||||||
expiresAt: Date;
|
|
||||||
|
|
||||||
@Column('text', { name: 'token', unique: true })
|
|
||||||
token: string;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'createdAt' })
|
|
||||||
createdAt: Date;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'updatedAt' })
|
|
||||||
updatedAt: Date;
|
|
||||||
|
|
||||||
@Column('text', { name: 'ipAddress', nullable: true })
|
|
||||||
ipAddress: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'userAgent', nullable: true })
|
|
||||||
userAgent: string | null;
|
|
||||||
|
|
||||||
@Index('session_userId_idx')
|
|
||||||
@Column('text', { name: 'userId' })
|
|
||||||
userId: string;
|
|
||||||
|
|
||||||
@ManyToOne(() => User, { onDelete: 'CASCADE', nullable: false })
|
|
||||||
@JoinColumn({ name: 'userId', referencedColumnName: 'id' })
|
|
||||||
user: User;
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
/**
|
|
||||||
* AUTOGENERATED
|
|
||||||
*/
|
|
||||||
import { Column, Entity, PrimaryColumn } from 'typeorm';
|
|
||||||
|
|
||||||
@Entity('user')
|
|
||||||
export class User {
|
|
||||||
@PrimaryColumn('text')
|
|
||||||
id: string;
|
|
||||||
|
|
||||||
@Column('text', { name: 'name' })
|
|
||||||
name: string;
|
|
||||||
|
|
||||||
@Column('text', { name: 'email', unique: true })
|
|
||||||
email: string;
|
|
||||||
|
|
||||||
@Column('boolean', { name: 'emailVerified', default: false })
|
|
||||||
emailVerified: boolean;
|
|
||||||
|
|
||||||
@Column('text', { name: 'image', nullable: true })
|
|
||||||
image: string | null;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'createdAt' })
|
|
||||||
createdAt: Date;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'updatedAt' })
|
|
||||||
updatedAt: Date;
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
/**
|
|
||||||
* AUTOGENERATED
|
|
||||||
*/
|
|
||||||
import { Column, Entity, Index, PrimaryColumn } from 'typeorm';
|
|
||||||
|
|
||||||
@Entity('verification')
|
|
||||||
export class Verification {
|
|
||||||
@PrimaryColumn('text')
|
|
||||||
id: string;
|
|
||||||
|
|
||||||
@Index('verification_identifier_idx')
|
|
||||||
@Column('text', { name: 'identifier' })
|
|
||||||
identifier: string;
|
|
||||||
|
|
||||||
@Column('text', { name: 'value' })
|
|
||||||
value: string;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'expiresAt' })
|
|
||||||
expiresAt: Date;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'createdAt' })
|
|
||||||
createdAt: Date;
|
|
||||||
|
|
||||||
@Column({ type: 'timestamp', name: 'updatedAt' })
|
|
||||||
updatedAt: Date;
|
|
||||||
}
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
import {
|
|
||||||
Column,
|
|
||||||
CreateDateColumn,
|
|
||||||
DeleteDateColumn,
|
|
||||||
PrimaryColumn,
|
|
||||||
PrimaryGeneratedColumn,
|
|
||||||
UpdateDateColumn,
|
|
||||||
} from 'typeorm';
|
|
||||||
|
|
||||||
// Layer 1 — timestamps only, always present
|
|
||||||
export abstract class TimestampedEntity {
|
|
||||||
@CreateDateColumn({ name: 'created_at' })
|
|
||||||
createdAt: Date;
|
|
||||||
|
|
||||||
@UpdateDateColumn({ name: 'updated_at' })
|
|
||||||
updatedAt: Date;
|
|
||||||
}
|
|
||||||
|
|
||||||
export abstract class TimestampedSortableEntity extends TimestampedEntity {
|
|
||||||
@Column('int', { name: 'sort_order', default: 0 })
|
|
||||||
sortOrder: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Layer 2 — adds soft delete
|
|
||||||
export abstract class SoftDeletableEntity extends TimestampedEntity {
|
|
||||||
@DeleteDateColumn({ name: 'deleted_at', nullable: true })
|
|
||||||
deletedAt: Date | null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Layer 3a — adds integer PK to timestamped entity
|
|
||||||
export abstract class IntBaseEntity extends TimestampedEntity {
|
|
||||||
@PrimaryGeneratedColumn()
|
|
||||||
id: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export abstract class IntSortableBaseEntity extends IntBaseEntity {
|
|
||||||
@Column('int', { name: 'sort_order', default: 0 })
|
|
||||||
sortOrder: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Layer 3b — adds integer PK + soft delete
|
|
||||||
export abstract class SoftDeletableIntBaseEntity extends SoftDeletableEntity {
|
|
||||||
@PrimaryGeneratedColumn()
|
|
||||||
id: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Layer 3c — natural/business string PK (e.g. country code, slug)
|
|
||||||
export abstract class StringBaseEntity extends TimestampedEntity {
|
|
||||||
@PrimaryColumn({ name: 'id' })
|
|
||||||
id: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export abstract class StringSortableBaseEntity extends StringBaseEntity {
|
|
||||||
@Column('int', { name: 'sort_order', default: 0 })
|
|
||||||
sortOrder: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Layer 3d — natural string PK + soft delete
|
|
||||||
export abstract class SoftDeletableStringBaseEntity extends SoftDeletableEntity {
|
|
||||||
@PrimaryColumn({ name: 'id' })
|
|
||||||
id: string;
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
import { Column, Entity, Index, JoinColumn, ManyToOne } from 'typeorm';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
import { SqliteUsers } from '../old-entities/SqliteUsers';
|
|
||||||
|
|
||||||
@Index('idx_mcp_tokens_hash', ['tokenHash'], { unique: true })
|
|
||||||
@Entity('mcp_tokens')
|
|
||||||
export class McpTokens extends IntBaseEntity {
|
|
||||||
@Column({ name: 'name' })
|
|
||||||
name: string;
|
|
||||||
|
|
||||||
@Column({ name: 'token_hash', unique: true })
|
|
||||||
tokenHash: string;
|
|
||||||
|
|
||||||
@Column({ name: 'token_prefix' })
|
|
||||||
tokenPrefix: string;
|
|
||||||
|
|
||||||
@Column({ name: 'last_used_at', nullable: true })
|
|
||||||
lastUsedAt: Date | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => SqliteUsers, (users) => users.mcpTokens, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'user_id', referencedColumnName: 'id' }])
|
|
||||||
user: SqliteUsers;
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
import {
|
|
||||||
Column,
|
|
||||||
Entity,
|
|
||||||
Index,
|
|
||||||
JoinColumn,
|
|
||||||
ManyToOne,
|
|
||||||
PrimaryColumn,
|
|
||||||
} from 'typeorm';
|
|
||||||
import { SqliteUsers } from '../old-entities/SqliteUsers';
|
|
||||||
|
|
||||||
@Index('idx_ncp_user', ['userId'], {})
|
|
||||||
@Entity('notification_channel_preferences')
|
|
||||||
export class NotificationChannelPreferences {
|
|
||||||
@PrimaryColumn('int', { name: 'user_id' })
|
|
||||||
userId: number;
|
|
||||||
|
|
||||||
@PrimaryColumn({ name: 'event_type' })
|
|
||||||
eventType: string;
|
|
||||||
|
|
||||||
@PrimaryColumn({ name: 'channel' })
|
|
||||||
channel: string;
|
|
||||||
|
|
||||||
@Column({ name: 'enabled', default: true })
|
|
||||||
enabled: boolean;
|
|
||||||
|
|
||||||
@ManyToOne(
|
|
||||||
() => SqliteUsers,
|
|
||||||
(users) => users.notificationChannelPreferences,
|
|
||||||
{
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
},
|
|
||||||
)
|
|
||||||
@JoinColumn([{ name: 'user_id', referencedColumnName: 'id' }])
|
|
||||||
user: SqliteUsers;
|
|
||||||
}
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
import { Column, Entity, Index, JoinColumn, ManyToOne } from 'typeorm';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
import { SqliteUsers } from '../old-entities/SqliteUsers';
|
|
||||||
|
|
||||||
@Index('idx_notifications_target_scope', ['target', 'scope'], {})
|
|
||||||
@Index('idx_notifications_recipient_created', ['recipientId', 'createdAt'], {})
|
|
||||||
@Index(
|
|
||||||
'idx_notifications_recipient',
|
|
||||||
['recipientId', 'isRead', 'createdAt'],
|
|
||||||
{},
|
|
||||||
)
|
|
||||||
@Entity('notifications')
|
|
||||||
export class Notifications extends IntBaseEntity {
|
|
||||||
@Column({ name: 'type' })
|
|
||||||
type: string;
|
|
||||||
|
|
||||||
@Column({ name: 'scope' })
|
|
||||||
scope: string;
|
|
||||||
|
|
||||||
@Column('int', { name: 'target' })
|
|
||||||
target: number;
|
|
||||||
|
|
||||||
@Column('int', { name: 'recipient_id' })
|
|
||||||
recipientId: number;
|
|
||||||
|
|
||||||
@Column({ name: 'title_key' })
|
|
||||||
titleKey: string;
|
|
||||||
|
|
||||||
@Column('simple-json', {
|
|
||||||
name: 'title_params',
|
|
||||||
nullable: true,
|
|
||||||
default: {},
|
|
||||||
})
|
|
||||||
titleParams: Record<string, unknown> | null;
|
|
||||||
|
|
||||||
@Column({ name: 'text_key' })
|
|
||||||
textKey: string;
|
|
||||||
|
|
||||||
@Column('simple-json', {
|
|
||||||
name: 'text_params',
|
|
||||||
nullable: true,
|
|
||||||
default: {},
|
|
||||||
})
|
|
||||||
textParams: Record<string, unknown> | null;
|
|
||||||
|
|
||||||
@Column({ name: 'positive_text_key', nullable: true })
|
|
||||||
positiveTextKey: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'negative_text_key', nullable: true })
|
|
||||||
negativeTextKey: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'positive_callback', nullable: true })
|
|
||||||
positiveCallback: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'negative_callback', nullable: true })
|
|
||||||
negativeCallback: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'response', nullable: true })
|
|
||||||
response: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'navigate_text_key', nullable: true })
|
|
||||||
navigateTextKey: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'navigate_target', nullable: true })
|
|
||||||
navigateTarget: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'is_read', nullable: true, default: false })
|
|
||||||
isRead: boolean | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => SqliteUsers, (users) => users.notifications, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'recipient_id', referencedColumnName: 'id' }])
|
|
||||||
recipient: SqliteUsers;
|
|
||||||
|
|
||||||
@ManyToOne(() => SqliteUsers, (users) => users.notifications2, {
|
|
||||||
onDelete: 'SET NULL',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'sender_id', referencedColumnName: 'id' }])
|
|
||||||
sender: SqliteUsers;
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
import {
|
|
||||||
Column,
|
|
||||||
Entity,
|
|
||||||
Index,
|
|
||||||
JoinColumn,
|
|
||||||
ManyToOne,
|
|
||||||
OneToMany,
|
|
||||||
} from 'typeorm';
|
|
||||||
import { OldOauthConsents } from './OldOauthConsents';
|
|
||||||
import { OldOauthTokens } from './OldOauthTokens';
|
|
||||||
import { SqliteUsers } from './SqliteUsers';
|
|
||||||
import { StringBaseEntity } from '../base/BaseEntity';
|
|
||||||
|
|
||||||
@Index('idx_oauth_clients_client_id', ['clientId'], { unique: true })
|
|
||||||
@Index('idx_oauth_clients_user', ['userId'], {})
|
|
||||||
@Entity('oauth_clients')
|
|
||||||
export class OldOauthClients extends StringBaseEntity {
|
|
||||||
@Column('int', { name: 'user_id', nullable: true })
|
|
||||||
userId: number | null;
|
|
||||||
|
|
||||||
@Column({ name: 'name' })
|
|
||||||
name: string;
|
|
||||||
|
|
||||||
@Column({ name: 'client_id', unique: true })
|
|
||||||
clientId: string;
|
|
||||||
|
|
||||||
@Column({ name: 'client_secret_hash' })
|
|
||||||
clientSecretHash: string;
|
|
||||||
|
|
||||||
@Column('simple-array', { name: 'redirect_uris', default: [] })
|
|
||||||
redirectUris: string[];
|
|
||||||
|
|
||||||
@Column('simple-array', { name: 'allowed_scopes', default: [] })
|
|
||||||
allowedScopes: string[];
|
|
||||||
|
|
||||||
@Column({ name: 'is_public', default: false })
|
|
||||||
isPublic: boolean;
|
|
||||||
|
|
||||||
@Column({ name: 'created_via', default: 'settings_ui' })
|
|
||||||
createdVia: string;
|
|
||||||
|
|
||||||
@OneToMany(() => OldOauthConsents, (oauthConsents) => oauthConsents.client)
|
|
||||||
oauthConsents: OldOauthConsents[];
|
|
||||||
|
|
||||||
@OneToMany(() => OldOauthTokens, (oauthTokens) => oauthTokens.client)
|
|
||||||
oauthTokens: OldOauthTokens[];
|
|
||||||
|
|
||||||
@ManyToOne(() => SqliteUsers, (users) => users.oauthClients, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'user_id', referencedColumnName: 'id' }])
|
|
||||||
user: SqliteUsers;
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
import { Column, Entity, JoinColumn, ManyToOne } from 'typeorm';
|
|
||||||
import { SqliteUsers } from './SqliteUsers';
|
|
||||||
import { OldOauthClients } from './OldOauthClients';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
|
|
||||||
@Entity('oauth_consents')
|
|
||||||
export class OldOauthConsents extends IntBaseEntity {
|
|
||||||
@Column('simple-array', { name: 'scopes', default: [] })
|
|
||||||
scopes: string[];
|
|
||||||
|
|
||||||
@ManyToOne(() => SqliteUsers, (users) => users.oauthConsents, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'user_id', referencedColumnName: 'id' }])
|
|
||||||
user: SqliteUsers;
|
|
||||||
|
|
||||||
@ManyToOne(
|
|
||||||
() => OldOauthClients,
|
|
||||||
(oauthClients) => oauthClients.oauthConsents,
|
|
||||||
{
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
},
|
|
||||||
)
|
|
||||||
@JoinColumn([{ name: 'client_id', referencedColumnName: 'clientId' }])
|
|
||||||
client: OldOauthClients;
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
import {
|
|
||||||
Column,
|
|
||||||
Entity,
|
|
||||||
Index,
|
|
||||||
JoinColumn,
|
|
||||||
ManyToOne,
|
|
||||||
OneToMany,
|
|
||||||
} from 'typeorm';
|
|
||||||
import { SqliteUsers } from './SqliteUsers';
|
|
||||||
import { OldOauthClients } from './OldOauthClients';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
|
|
||||||
@Index('idx_oauth_tokens_parent', ['parentTokenId'], {})
|
|
||||||
@Index('idx_oauth_tokens_refresh', ['refreshTokenHash'], { unique: true })
|
|
||||||
@Index('idx_oauth_tokens_access', ['accessTokenHash'], { unique: true })
|
|
||||||
@Index('idx_oauth_tokens_user', ['userId'], {})
|
|
||||||
@Entity('oauth_tokens')
|
|
||||||
export class OldOauthTokens extends IntBaseEntity {
|
|
||||||
@Column('int', { name: 'user_id' })
|
|
||||||
userId: number;
|
|
||||||
|
|
||||||
@Column({ name: 'access_token_hash', unique: true })
|
|
||||||
accessTokenHash: string;
|
|
||||||
|
|
||||||
@Column({ name: 'refresh_token_hash', unique: true })
|
|
||||||
refreshTokenHash: string;
|
|
||||||
|
|
||||||
@Column('simple-array', { name: 'scopes', default: [] })
|
|
||||||
scopes: string[];
|
|
||||||
|
|
||||||
@Column('datetime', { name: 'access_token_expires_at' })
|
|
||||||
accessTokenExpiresAt: Date;
|
|
||||||
|
|
||||||
@Column('datetime', { name: 'refresh_token_expires_at' })
|
|
||||||
refreshTokenExpiresAt: Date;
|
|
||||||
|
|
||||||
@Column('datetime', { name: 'revoked_at', nullable: true })
|
|
||||||
revokedAt: Date | null;
|
|
||||||
|
|
||||||
@Column('int', { name: 'parent_token_id', nullable: true })
|
|
||||||
parentTokenId: number | null;
|
|
||||||
|
|
||||||
@Column({ name: 'audience', nullable: true })
|
|
||||||
audience: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => OldOauthTokens, (oauthTokens) => oauthTokens.oauthTokens)
|
|
||||||
@JoinColumn([{ name: 'parent_token_id', referencedColumnName: 'id' }])
|
|
||||||
parentToken: OldOauthTokens;
|
|
||||||
|
|
||||||
@OneToMany(() => OldOauthTokens, (oauthTokens) => oauthTokens.parentToken)
|
|
||||||
oauthTokens: OldOauthTokens[];
|
|
||||||
|
|
||||||
@ManyToOne(() => SqliteUsers, (users) => users.oauthTokens, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'user_id', referencedColumnName: 'id' }])
|
|
||||||
user: SqliteUsers;
|
|
||||||
|
|
||||||
@ManyToOne(
|
|
||||||
() => OldOauthClients,
|
|
||||||
(oauthClients) => oauthClients.oauthTokens,
|
|
||||||
{
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
},
|
|
||||||
)
|
|
||||||
@JoinColumn([{ name: 'client_id', referencedColumnName: 'clientId' }])
|
|
||||||
client: OldOauthClients;
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import { Column, Entity, Index, JoinColumn, ManyToOne } from 'typeorm';
|
|
||||||
import { SqliteUsers } from './SqliteUsers';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
|
|
||||||
@Index('idx_prt_hash', ['tokenHash'], {})
|
|
||||||
@Index('idx_prt_user', ['userId'], {})
|
|
||||||
@Entity('password_reset_tokens')
|
|
||||||
export class OldPasswordResetTokens extends IntBaseEntity {
|
|
||||||
@Column('int', { name: 'user_id' })
|
|
||||||
userId: number;
|
|
||||||
|
|
||||||
@Column({ name: 'token_hash', unique: true })
|
|
||||||
tokenHash: string;
|
|
||||||
|
|
||||||
@Column({ name: 'expires_at' })
|
|
||||||
expiresAt: Date;
|
|
||||||
|
|
||||||
@Column({ name: 'consumed_at', nullable: true })
|
|
||||||
consumedAt: Date | null;
|
|
||||||
|
|
||||||
@Column({ name: 'created_ip', nullable: true })
|
|
||||||
createdIp: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => SqliteUsers, (users) => users.passwordResetTokens, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'user_id', referencedColumnName: 'id' }])
|
|
||||||
user: SqliteUsers;
|
|
||||||
}
|
|
||||||
@@ -1,341 +0,0 @@
|
|||||||
import {
|
|
||||||
Column,
|
|
||||||
Entity,
|
|
||||||
Index,
|
|
||||||
JoinTable,
|
|
||||||
ManyToMany,
|
|
||||||
OneToMany,
|
|
||||||
OneToOne,
|
|
||||||
} from 'typeorm';
|
|
||||||
import { OldPasswordResetTokens } from './OldPasswordResetTokens';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
import { Settings } from '../system/Settings';
|
|
||||||
import { Trips } from '../trip/Trips';
|
|
||||||
import { Categories } from '../trip/Categories';
|
|
||||||
import { Tags } from '../trip/Tags';
|
|
||||||
import { TripFiles } from '../trip/files/TripFiles';
|
|
||||||
import { BudgetItems } from '../trip/budget/BudgetItems';
|
|
||||||
import { VacayPlans } from '../vacay/VacayPlans';
|
|
||||||
import { TripMembers } from '../trip/TripMembers';
|
|
||||||
import { VacayPlanMembers } from '../vacay/VacayPlanMembers';
|
|
||||||
import { VacayUserColors } from '../vacay/VacayUserColors';
|
|
||||||
import { VacayUserYears } from '../vacay/VacayUserYears';
|
|
||||||
import { VacayEntries } from '../vacay/VacayEntries';
|
|
||||||
import { CollabNotes } from '../trip/collab/CollabNotes';
|
|
||||||
import { CollabPolls } from '../trip/collab/CollabPolls';
|
|
||||||
import { CollabPollVotes } from '../trip/collab/CollabPollVotes';
|
|
||||||
import { CollabMessages } from '../trip/collab/CollabMessages';
|
|
||||||
import { AssignmentParticipants } from '../trip/AssignmentParticipants';
|
|
||||||
import { AuditLog } from '../system/AuditLog';
|
|
||||||
import { Notifications } from '../notification/Notifications';
|
|
||||||
import { NotificationChannelPreferences } from '../notification/NotificationChannelPreferences';
|
|
||||||
import { BudgetItemMembers } from '../trip/budget/BudgetItemMembers';
|
|
||||||
import { CollabMessageReactions } from '../trip/collab/CollabMessageReactions';
|
|
||||||
import { InviteTokens } from '../system/InviteTokens';
|
|
||||||
import { PackingCategoryAssignees } from '../trip/lists/PackingCategoryAssignees';
|
|
||||||
import { PackingTemplates } from '../trip/lists/PackingTemplates';
|
|
||||||
import { PackingBags } from '../trip/lists/PackingBags';
|
|
||||||
import { VisitedCountries } from '../atlas/VisitedCountries';
|
|
||||||
import { BucketList } from '../atlas/BucketList';
|
|
||||||
import { ShareTokens } from '../trip/ShareTokens';
|
|
||||||
import { McpTokens } from '../mcp/McpTokens';
|
|
||||||
import { TripAlbumLinks } from '../trip/journey/TripAlbumLinks';
|
|
||||||
import { TodoItems } from '../trip/lists/TodoItems';
|
|
||||||
import { TodoCategoryAssignees } from '../trip/lists/TodoCategoryAssignees';
|
|
||||||
import { VisitedRegions } from '../atlas/VisitedRegions';
|
|
||||||
import { OldOauthConsents } from './OldOauthConsents';
|
|
||||||
import { OldOauthTokens } from './OldOauthTokens';
|
|
||||||
import { Journeys } from '../trip/journey/Journeys';
|
|
||||||
import { JourneyEntries } from '../trip/journey/JourneyEntries';
|
|
||||||
import { JourneyContributors } from '../trip/journey/JourneyContributors';
|
|
||||||
import { JourneyShareTokens } from '../trip/journey/JourneyShareTokens';
|
|
||||||
import { TrekPhotos } from '../trip/journey/TrekPhotos';
|
|
||||||
import { TripPhotos } from '../trip/TripPhotos';
|
|
||||||
import { UserNoticeDismissals } from '../system/UserNoticeDismissals';
|
|
||||||
import { IdempotencyKeys } from '../system/IdempotencyKeys';
|
|
||||||
import { OldOauthClients } from './OldOauthClients';
|
|
||||||
|
|
||||||
@Index('idx_users_email', ['email'], {})
|
|
||||||
@Entity('users')
|
|
||||||
export class SqliteUsers extends IntBaseEntity {
|
|
||||||
@Column({ name: 'username', unique: true })
|
|
||||||
username: string;
|
|
||||||
|
|
||||||
@Column({ name: 'email', unique: true })
|
|
||||||
email: string;
|
|
||||||
|
|
||||||
@Column({ name: 'password_hash' })
|
|
||||||
passwordHash: string;
|
|
||||||
|
|
||||||
@Column({ name: 'role', default: 'user' })
|
|
||||||
role: string;
|
|
||||||
|
|
||||||
@Column({ name: 'maps_api_key', nullable: true })
|
|
||||||
mapsApiKey: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'unsplash_api_key', nullable: true })
|
|
||||||
unsplashApiKey: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'openweather_api_key', nullable: true })
|
|
||||||
openweatherApiKey: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'avatar', nullable: true })
|
|
||||||
avatar: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'oidc_sub', nullable: true })
|
|
||||||
oidcSub: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'oidc_issuer', nullable: true })
|
|
||||||
oidcIssuer: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'last_login', nullable: true })
|
|
||||||
lastLogin: Date | null;
|
|
||||||
|
|
||||||
@Column({
|
|
||||||
name: 'mfa_enabled',
|
|
||||||
default: false,
|
|
||||||
})
|
|
||||||
mfaEnabled: boolean;
|
|
||||||
|
|
||||||
@Column({ name: 'mfa_secret', nullable: true })
|
|
||||||
mfaSecret: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'mfa_backup_codes', nullable: true })
|
|
||||||
mfaBackupCodes: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'immich_url', nullable: true })
|
|
||||||
immichUrl: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'immich_access_token', nullable: true })
|
|
||||||
immichAccessToken: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'synology_url', nullable: true })
|
|
||||||
synologyUrl: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'synology_username', nullable: true })
|
|
||||||
synologyUsername: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'synology_password', nullable: true })
|
|
||||||
synologyPassword: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'synology_sid', nullable: true })
|
|
||||||
synologySid: string | null;
|
|
||||||
|
|
||||||
@Column({
|
|
||||||
name: 'must_change_password',
|
|
||||||
default: false,
|
|
||||||
})
|
|
||||||
mustChangePassword: boolean;
|
|
||||||
|
|
||||||
@Column('int', { name: 'password_version', default: 0 })
|
|
||||||
passwordVersion: number;
|
|
||||||
|
|
||||||
@Column({ name: 'immich_api_key', nullable: true })
|
|
||||||
immichApiKey: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'synology_skip_ssl', default: false })
|
|
||||||
synologySkipSsl: boolean;
|
|
||||||
|
|
||||||
@Column({ name: 'synology_did', nullable: true })
|
|
||||||
synologyDid: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'first_seen_version', default: '0.0.0' })
|
|
||||||
firstSeenVersion: string;
|
|
||||||
|
|
||||||
@Column('int', { name: 'login_count', default: 0 })
|
|
||||||
loginCount: number;
|
|
||||||
|
|
||||||
@Column({ name: 'immich_auto_upload', default: false })
|
|
||||||
immichAutoUpload: boolean;
|
|
||||||
|
|
||||||
@OneToMany(
|
|
||||||
() => OldPasswordResetTokens,
|
|
||||||
(passwordResetTokens) => passwordResetTokens.user,
|
|
||||||
)
|
|
||||||
passwordResetTokens: OldPasswordResetTokens[];
|
|
||||||
|
|
||||||
@OneToMany(() => Settings, (settings) => settings.user)
|
|
||||||
settings: Settings[];
|
|
||||||
|
|
||||||
@OneToMany(() => Trips, (trips) => trips.user)
|
|
||||||
trips: Trips[];
|
|
||||||
|
|
||||||
@OneToMany(() => Categories, (categories) => categories.user)
|
|
||||||
categories: Categories[];
|
|
||||||
|
|
||||||
@OneToMany(() => Tags, (tags) => tags.user)
|
|
||||||
tags: Tags[];
|
|
||||||
|
|
||||||
@OneToMany(() => TripFiles, (tripFiles) => tripFiles.uploadedBy)
|
|
||||||
tripFiles: TripFiles[];
|
|
||||||
|
|
||||||
@OneToMany(() => TripMembers, (tripMembers) => tripMembers.invitedBy)
|
|
||||||
tripMembers: TripMembers[];
|
|
||||||
|
|
||||||
@OneToMany(() => TripMembers, (tripMembers) => tripMembers.user)
|
|
||||||
tripMembers2: TripMembers[];
|
|
||||||
|
|
||||||
@OneToMany(() => BudgetItems, (budgetItems) => budgetItems.paidByUser)
|
|
||||||
budgetItems: BudgetItems[];
|
|
||||||
|
|
||||||
@OneToOne(() => VacayPlans, (vacayPlans) => vacayPlans.owner)
|
|
||||||
vacayPlans: VacayPlans;
|
|
||||||
|
|
||||||
@OneToMany(
|
|
||||||
() => VacayPlanMembers,
|
|
||||||
(vacayPlanMembers) => vacayPlanMembers.user,
|
|
||||||
)
|
|
||||||
vacayPlanMembers: VacayPlanMembers[];
|
|
||||||
|
|
||||||
@OneToMany(() => VacayUserColors, (vacayUserColors) => vacayUserColors.user)
|
|
||||||
vacayUserColors: VacayUserColors[];
|
|
||||||
|
|
||||||
@OneToMany(() => VacayUserYears, (vacayUserYears) => vacayUserYears.user)
|
|
||||||
vacayUserYears: VacayUserYears[];
|
|
||||||
|
|
||||||
@OneToMany(() => VacayEntries, (vacayEntries) => vacayEntries.user)
|
|
||||||
vacayEntries: VacayEntries[];
|
|
||||||
|
|
||||||
@OneToMany(() => CollabNotes, (collabNotes) => collabNotes.user)
|
|
||||||
collabNotes: CollabNotes[];
|
|
||||||
|
|
||||||
@OneToMany(() => CollabPolls, (collabPolls) => collabPolls.user)
|
|
||||||
collabPolls: CollabPolls[];
|
|
||||||
|
|
||||||
@OneToMany(() => CollabPollVotes, (collabPollVotes) => collabPollVotes.user)
|
|
||||||
collabPollVotes: CollabPollVotes[];
|
|
||||||
|
|
||||||
@OneToMany(() => CollabMessages, (collabMessages) => collabMessages.user)
|
|
||||||
collabMessages: CollabMessages[];
|
|
||||||
|
|
||||||
@OneToMany(
|
|
||||||
() => AssignmentParticipants,
|
|
||||||
(assignmentParticipants) => assignmentParticipants.user,
|
|
||||||
)
|
|
||||||
assignmentParticipants: AssignmentParticipants[];
|
|
||||||
|
|
||||||
@OneToMany(() => AuditLog, (auditLog) => auditLog.user)
|
|
||||||
auditLogs: AuditLog[];
|
|
||||||
|
|
||||||
@OneToMany(() => Notifications, (notifications) => notifications.recipient)
|
|
||||||
notifications: Notifications[];
|
|
||||||
|
|
||||||
@OneToMany(() => Notifications, (notifications) => notifications.sender)
|
|
||||||
notifications2: Notifications[];
|
|
||||||
|
|
||||||
@OneToMany(
|
|
||||||
() => NotificationChannelPreferences,
|
|
||||||
(notificationChannelPreferences) => notificationChannelPreferences.user,
|
|
||||||
)
|
|
||||||
notificationChannelPreferences: NotificationChannelPreferences[];
|
|
||||||
|
|
||||||
@OneToMany(
|
|
||||||
() => BudgetItemMembers,
|
|
||||||
(budgetItemMembers) => budgetItemMembers.user,
|
|
||||||
)
|
|
||||||
budgetItemMembers: BudgetItemMembers[];
|
|
||||||
|
|
||||||
@OneToMany(
|
|
||||||
() => CollabMessageReactions,
|
|
||||||
(collabMessageReactions) => collabMessageReactions.user,
|
|
||||||
)
|
|
||||||
collabMessageReactions: CollabMessageReactions[];
|
|
||||||
|
|
||||||
@OneToMany(() => InviteTokens, (inviteTokens) => inviteTokens.createdBy)
|
|
||||||
inviteTokens: InviteTokens[];
|
|
||||||
|
|
||||||
@OneToMany(
|
|
||||||
() => PackingCategoryAssignees,
|
|
||||||
(packingCategoryAssignees) => packingCategoryAssignees.user,
|
|
||||||
)
|
|
||||||
packingCategoryAssignees: PackingCategoryAssignees[];
|
|
||||||
|
|
||||||
@OneToMany(
|
|
||||||
() => PackingTemplates,
|
|
||||||
(packingTemplates) => packingTemplates.createdBy,
|
|
||||||
)
|
|
||||||
packingTemplates: PackingTemplates[];
|
|
||||||
|
|
||||||
@OneToMany(() => PackingBags, (packingBags) => packingBags.user)
|
|
||||||
packingBags: PackingBags[];
|
|
||||||
|
|
||||||
@OneToMany(
|
|
||||||
() => VisitedCountries,
|
|
||||||
(visitedCountries) => visitedCountries.user,
|
|
||||||
)
|
|
||||||
visitedCountries: VisitedCountries[];
|
|
||||||
|
|
||||||
@OneToMany(() => BucketList, (bucketList) => bucketList.user)
|
|
||||||
bucketLists: BucketList[];
|
|
||||||
|
|
||||||
@OneToMany(() => ShareTokens, (shareTokens) => shareTokens.createdBy)
|
|
||||||
shareTokens: ShareTokens[];
|
|
||||||
|
|
||||||
@OneToMany(() => McpTokens, (mcpTokens) => mcpTokens.user)
|
|
||||||
mcpTokens: McpTokens[];
|
|
||||||
|
|
||||||
@OneToMany(() => TripAlbumLinks, (tripAlbumLinks) => tripAlbumLinks.user)
|
|
||||||
tripAlbumLinks: TripAlbumLinks[];
|
|
||||||
|
|
||||||
@OneToMany(() => TodoItems, (todoItems) => todoItems.assignedUser)
|
|
||||||
todoItems: TodoItems[];
|
|
||||||
|
|
||||||
@OneToMany(
|
|
||||||
() => TodoCategoryAssignees,
|
|
||||||
(todoCategoryAssignees) => todoCategoryAssignees.user,
|
|
||||||
)
|
|
||||||
todoCategoryAssignees: TodoCategoryAssignees[];
|
|
||||||
|
|
||||||
@OneToMany(() => VisitedRegions, (visitedRegions) => visitedRegions.user)
|
|
||||||
visitedRegions: VisitedRegions[];
|
|
||||||
|
|
||||||
@ManyToMany(() => PackingBags, (packingBags) => packingBags.users)
|
|
||||||
@JoinTable({
|
|
||||||
name: 'packing_bag_members',
|
|
||||||
joinColumns: [{ name: 'user_id', referencedColumnName: 'id' }],
|
|
||||||
inverseJoinColumns: [{ name: 'bag_id', referencedColumnName: 'id' }],
|
|
||||||
})
|
|
||||||
packingBags2: PackingBags[];
|
|
||||||
|
|
||||||
@OneToMany(() => OldOauthConsents, (oauthConsents) => oauthConsents.user)
|
|
||||||
oauthConsents: OldOauthConsents[];
|
|
||||||
|
|
||||||
@OneToMany(() => OldOauthTokens, (oauthTokens) => oauthTokens.user)
|
|
||||||
oauthTokens: OldOauthTokens[];
|
|
||||||
|
|
||||||
@OneToMany(() => Journeys, (journeys) => journeys.user)
|
|
||||||
journeys: Journeys[];
|
|
||||||
|
|
||||||
@OneToMany(() => JourneyEntries, (journeyEntries) => journeyEntries.author)
|
|
||||||
journeyEntries: JourneyEntries[];
|
|
||||||
|
|
||||||
@OneToMany(
|
|
||||||
() => JourneyContributors,
|
|
||||||
(journeyContributors) => journeyContributors.user,
|
|
||||||
)
|
|
||||||
journeyContributors: JourneyContributors[];
|
|
||||||
|
|
||||||
@OneToMany(
|
|
||||||
() => JourneyShareTokens,
|
|
||||||
(journeyShareTokens) => journeyShareTokens.createdBy,
|
|
||||||
)
|
|
||||||
journeyShareTokens: JourneyShareTokens[];
|
|
||||||
|
|
||||||
@OneToMany(() => TrekPhotos, (trekPhotos) => trekPhotos.owner)
|
|
||||||
trekPhotos: TrekPhotos[];
|
|
||||||
|
|
||||||
@OneToMany(() => TripPhotos, (tripPhotos) => tripPhotos.user)
|
|
||||||
tripPhotos: TripPhotos[];
|
|
||||||
|
|
||||||
@OneToMany(
|
|
||||||
() => UserNoticeDismissals,
|
|
||||||
(userNoticeDismissals) => userNoticeDismissals.user,
|
|
||||||
)
|
|
||||||
userNoticeDismissals: UserNoticeDismissals[];
|
|
||||||
|
|
||||||
@OneToMany(() => IdempotencyKeys, (idempotencyKeys) => idempotencyKeys.user)
|
|
||||||
idempotencyKeys: IdempotencyKeys[];
|
|
||||||
|
|
||||||
@OneToMany(() => OldOauthClients, (oauthClients) => oauthClients.user)
|
|
||||||
oauthClients: OldOauthClients[];
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
import { Column, Entity } from 'typeorm';
|
|
||||||
import { StringSortableBaseEntity } from '../base/BaseEntity';
|
|
||||||
|
|
||||||
@Entity('addons')
|
|
||||||
export class Addons extends StringSortableBaseEntity {
|
|
||||||
@Column({ name: 'name' })
|
|
||||||
name: string;
|
|
||||||
|
|
||||||
@Column({ name: 'description', nullable: true })
|
|
||||||
description: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'type', default: 'global' })
|
|
||||||
type: string;
|
|
||||||
|
|
||||||
@Column({ name: 'icon', default: 'Puzzle' })
|
|
||||||
icon: string | null;
|
|
||||||
|
|
||||||
@Column('int', { name: 'enabled', default: 0 })
|
|
||||||
enabled: number;
|
|
||||||
|
|
||||||
@Column('simple-json', { name: 'config', nullable: true, default: null })
|
|
||||||
config: Record<string, unknown> | null;
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
import { Column, Entity, PrimaryColumn } from 'typeorm';
|
|
||||||
|
|
||||||
@Entity('app_settings')
|
|
||||||
export class AppSettings {
|
|
||||||
@PrimaryColumn({ name: 'key' })
|
|
||||||
declare id: string;
|
|
||||||
|
|
||||||
@Column({ name: 'value', nullable: true })
|
|
||||||
value: string | null;
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
import { Column, Entity, Index, JoinColumn, ManyToOne } from 'typeorm';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
import { SqliteUsers } from '../old-entities/SqliteUsers';
|
|
||||||
|
|
||||||
@Index('idx_audit_log_created', ['createdAt'], {})
|
|
||||||
@Entity('audit_log')
|
|
||||||
export class AuditLog extends IntBaseEntity {
|
|
||||||
@Column({ name: 'action' })
|
|
||||||
action: string;
|
|
||||||
|
|
||||||
@Column({ name: 'resource', nullable: true })
|
|
||||||
resource: string | null;
|
|
||||||
|
|
||||||
@Column('simple-json', { name: 'details', nullable: true })
|
|
||||||
details: Record<string, unknown> | null;
|
|
||||||
|
|
||||||
@Column({ name: 'ip', nullable: true })
|
|
||||||
ip: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => SqliteUsers, (users) => users.auditLogs, {
|
|
||||||
onDelete: 'SET NULL',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'user_id', referencedColumnName: 'id' }])
|
|
||||||
user: SqliteUsers;
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
import { Entity, JoinColumn, ManyToOne } from 'typeorm';
|
|
||||||
import { Places } from '../trip/Places';
|
|
||||||
import { Reservations } from '../trip/reservation/Reservations';
|
|
||||||
import { TripFiles } from '../trip/files/TripFiles';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
import { DayAssignments } from '../trip/DayAssignments';
|
|
||||||
|
|
||||||
@Entity('file_links')
|
|
||||||
export class FileLinks extends IntBaseEntity {
|
|
||||||
@ManyToOne(() => Places, (places) => places.fileLinks, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'place_id', referencedColumnName: 'id' }])
|
|
||||||
place: Places;
|
|
||||||
|
|
||||||
@ManyToOne(
|
|
||||||
() => DayAssignments,
|
|
||||||
(dayAssignments) => dayAssignments.fileLinks,
|
|
||||||
{ onDelete: 'CASCADE' },
|
|
||||||
)
|
|
||||||
@JoinColumn([{ name: 'assignment_id', referencedColumnName: 'id' }])
|
|
||||||
assignment: DayAssignments;
|
|
||||||
|
|
||||||
@ManyToOne(() => Reservations, (reservations) => reservations.fileLinks, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'reservation_id', referencedColumnName: 'id' }])
|
|
||||||
reservation: Reservations;
|
|
||||||
|
|
||||||
@ManyToOne(() => TripFiles, (tripFiles) => tripFiles.fileLinks, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'file_id', referencedColumnName: 'id' }])
|
|
||||||
file: TripFiles;
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
import {
|
|
||||||
Column,
|
|
||||||
Entity,
|
|
||||||
Index,
|
|
||||||
JoinColumn,
|
|
||||||
ManyToOne,
|
|
||||||
PrimaryColumn,
|
|
||||||
} from 'typeorm';
|
|
||||||
import { TimestampedEntity } from '../base/BaseEntity';
|
|
||||||
import { SqliteUsers } from '../old-entities/SqliteUsers';
|
|
||||||
|
|
||||||
@Index('idx_idempotency_keys_created', ['createdAt'], {})
|
|
||||||
@Entity('idempotency_keys')
|
|
||||||
export class IdempotencyKeys extends TimestampedEntity {
|
|
||||||
@PrimaryColumn({ name: 'key' })
|
|
||||||
key: string;
|
|
||||||
|
|
||||||
@PrimaryColumn('int', { name: 'user_id' })
|
|
||||||
userId: number;
|
|
||||||
|
|
||||||
@PrimaryColumn({ name: 'method' })
|
|
||||||
method: string;
|
|
||||||
|
|
||||||
@PrimaryColumn('text', { name: 'path' })
|
|
||||||
path: string;
|
|
||||||
|
|
||||||
@Column('int', { name: 'status_code' })
|
|
||||||
statusCode: number;
|
|
||||||
|
|
||||||
@Column('text', { name: 'response_body' })
|
|
||||||
responseBody: string;
|
|
||||||
|
|
||||||
@ManyToOne(() => SqliteUsers, (users) => users.idempotencyKeys, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'user_id', referencedColumnName: 'id' }])
|
|
||||||
user: SqliteUsers;
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
import { Column, Entity, JoinColumn, ManyToOne } from 'typeorm';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
import { SqliteUsers } from '../old-entities/SqliteUsers';
|
|
||||||
|
|
||||||
@Entity('invite_tokens')
|
|
||||||
export class InviteTokens extends IntBaseEntity {
|
|
||||||
@Column({ name: 'token', unique: true })
|
|
||||||
token: string;
|
|
||||||
|
|
||||||
@Column('int', { name: 'max_uses', default: 1 })
|
|
||||||
maxUses: number;
|
|
||||||
|
|
||||||
@Column('int', { name: 'used_count', default: 0 })
|
|
||||||
usedCount: number;
|
|
||||||
|
|
||||||
@Column({ name: 'expires_at', nullable: true })
|
|
||||||
expiresAt: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => SqliteUsers, (users) => users.inviteTokens, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'created_by', referencedColumnName: 'id' }])
|
|
||||||
createdBy: SqliteUsers;
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
import { Column, Entity, PrimaryColumn } from 'typeorm';
|
|
||||||
|
|
||||||
@Entity('schema_version')
|
|
||||||
export class SchemaVersion {
|
|
||||||
@PrimaryColumn('int', { name: 'id' })
|
|
||||||
id: number | null;
|
|
||||||
|
|
||||||
@Column('int', { name: 'version' })
|
|
||||||
version: number;
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
import { Column, Entity, JoinColumn, ManyToOne } from 'typeorm';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
import { SqliteUsers } from '../old-entities/SqliteUsers';
|
|
||||||
|
|
||||||
@Entity('settings')
|
|
||||||
export class Settings extends IntBaseEntity {
|
|
||||||
@Column({ name: 'key' })
|
|
||||||
key: string;
|
|
||||||
|
|
||||||
@Column({ name: 'value', nullable: true })
|
|
||||||
value: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => SqliteUsers, (users) => users.settings, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'user_id', referencedColumnName: 'id' }])
|
|
||||||
user: SqliteUsers;
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from 'typeorm';
|
|
||||||
import { TimestampedEntity } from '../base/BaseEntity';
|
|
||||||
import { SqliteUsers } from '../old-entities/SqliteUsers';
|
|
||||||
|
|
||||||
@Entity('user_notice_dismissals')
|
|
||||||
export class UserNoticeDismissals extends TimestampedEntity {
|
|
||||||
@PrimaryColumn('int', { name: 'user_id' })
|
|
||||||
userId: number;
|
|
||||||
|
|
||||||
@PrimaryColumn({ name: 'notice_id' })
|
|
||||||
noticeId: string;
|
|
||||||
|
|
||||||
@Column('int', { name: 'dismissed_at' })
|
|
||||||
dismissedAt: number;
|
|
||||||
|
|
||||||
@ManyToOne(() => SqliteUsers, (users) => users.userNoticeDismissals, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'user_id', referencedColumnName: 'id' }])
|
|
||||||
user: SqliteUsers;
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
import { Column, Entity, Index, JoinColumn, ManyToOne } from 'typeorm';
|
|
||||||
import { DayAssignments } from './DayAssignments';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
import { SqliteUsers } from '../old-entities/SqliteUsers';
|
|
||||||
|
|
||||||
@Index('idx_assignment_participants_assignment', ['assignmentId'], {})
|
|
||||||
@Entity('assignment_participants')
|
|
||||||
export class AssignmentParticipants extends IntBaseEntity {
|
|
||||||
@Column('int', { name: 'assignment_id' })
|
|
||||||
assignmentId: number;
|
|
||||||
|
|
||||||
@ManyToOne(() => SqliteUsers, (users) => users.assignmentParticipants, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'user_id', referencedColumnName: 'id' }])
|
|
||||||
user: SqliteUsers;
|
|
||||||
|
|
||||||
@ManyToOne(
|
|
||||||
() => DayAssignments,
|
|
||||||
(dayAssignments) => dayAssignments.assignmentParticipants,
|
|
||||||
{ onDelete: 'CASCADE' },
|
|
||||||
)
|
|
||||||
@JoinColumn([{ name: 'assignment_id', referencedColumnName: 'id' }])
|
|
||||||
assignment: DayAssignments;
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
import { Column, Entity, JoinColumn, ManyToOne, OneToMany } from 'typeorm';
|
|
||||||
import { Places } from './Places';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
import { SqliteUsers } from '../old-entities/SqliteUsers';
|
|
||||||
|
|
||||||
@Entity('categories')
|
|
||||||
export class Categories extends IntBaseEntity {
|
|
||||||
@Column({ name: 'name' })
|
|
||||||
name: string;
|
|
||||||
|
|
||||||
@Column({ name: 'color', nullable: true, default: '#6366f1' })
|
|
||||||
color: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'icon', nullable: true, default: '📍' })
|
|
||||||
icon: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => SqliteUsers, (users) => users.categories, {
|
|
||||||
onDelete: 'SET NULL',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'user_id', referencedColumnName: 'id' }])
|
|
||||||
user: SqliteUsers;
|
|
||||||
|
|
||||||
@OneToMany(() => Places, (places) => places.category)
|
|
||||||
places: Places[];
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
import { Column, Entity, Index, JoinColumn, ManyToOne } from 'typeorm';
|
|
||||||
import { Days } from './Days';
|
|
||||||
import { Places } from './Places';
|
|
||||||
import { Trips } from './Trips';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
|
|
||||||
@Index('idx_day_accommodations_end_day_id', ['endDayId'], {})
|
|
||||||
@Index('idx_day_accommodations_start_day_id', ['startDayId'], {})
|
|
||||||
@Index('idx_day_accommodations_trip_id', ['tripId'], {})
|
|
||||||
@Entity('day_accommodations')
|
|
||||||
export class DayAccommodations extends IntBaseEntity {
|
|
||||||
@Column('int', { name: 'trip_id' })
|
|
||||||
tripId: number;
|
|
||||||
|
|
||||||
@Column('int', { name: 'start_day_id' })
|
|
||||||
startDayId: number;
|
|
||||||
|
|
||||||
@Column('int', { name: 'end_day_id' })
|
|
||||||
endDayId: number;
|
|
||||||
|
|
||||||
@Column({ name: 'check_in', nullable: true })
|
|
||||||
checkIn: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'check_in_end', nullable: true })
|
|
||||||
checkInEnd: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'check_out', nullable: true })
|
|
||||||
checkOut: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'confirmation', nullable: true })
|
|
||||||
confirmation: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'notes', nullable: true })
|
|
||||||
notes: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => Days, (days) => days.dayAccommodations, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'end_day_id', referencedColumnName: 'id' }])
|
|
||||||
endDay: Days;
|
|
||||||
|
|
||||||
@ManyToOne(() => Days, (days) => days.dayAccommodations2, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'start_day_id', referencedColumnName: 'id' }])
|
|
||||||
startDay: Days;
|
|
||||||
|
|
||||||
@ManyToOne(() => Places, (places) => places.dayAccommodations, {
|
|
||||||
onDelete: 'SET NULL',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'place_id', referencedColumnName: 'id' }])
|
|
||||||
place: Places;
|
|
||||||
|
|
||||||
@ManyToOne(() => Trips, (trips) => trips.dayAccommodations, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'trip_id', referencedColumnName: 'id' }])
|
|
||||||
trip: Trips;
|
|
||||||
}
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
import {
|
|
||||||
Column,
|
|
||||||
Entity,
|
|
||||||
Index,
|
|
||||||
JoinColumn,
|
|
||||||
ManyToOne,
|
|
||||||
OneToMany,
|
|
||||||
} from 'typeorm';
|
|
||||||
import { Places } from './Places';
|
|
||||||
import { Days } from './Days';
|
|
||||||
import { AssignmentParticipants } from './AssignmentParticipants';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
import { Reservations } from './reservation/Reservations';
|
|
||||||
import { FileLinks } from '../system/FileLinks';
|
|
||||||
|
|
||||||
@Index('idx_day_assignments_place_id', ['placeId'], {})
|
|
||||||
@Index('idx_day_assignments_day_id', ['dayId'], {})
|
|
||||||
@Entity('day_assignments')
|
|
||||||
export class DayAssignments extends IntBaseEntity {
|
|
||||||
@Column('int', { name: 'day_id' })
|
|
||||||
dayId: number;
|
|
||||||
|
|
||||||
@Column('int', { name: 'place_id' })
|
|
||||||
placeId: number;
|
|
||||||
|
|
||||||
@Column('int', {
|
|
||||||
name: 'order_index',
|
|
||||||
nullable: true,
|
|
||||||
default: 0,
|
|
||||||
})
|
|
||||||
orderIndex: number | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'notes', nullable: true })
|
|
||||||
notes: string | null;
|
|
||||||
|
|
||||||
@Column({
|
|
||||||
name: 'reservation_status',
|
|
||||||
nullable: true,
|
|
||||||
default: 'none',
|
|
||||||
})
|
|
||||||
reservationStatus: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'reservation_notes', nullable: true })
|
|
||||||
reservationNotes: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'reservation_datetime', nullable: true })
|
|
||||||
reservationDatetime: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'assignment_time', nullable: true })
|
|
||||||
assignmentTime: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'assignment_end_time', nullable: true })
|
|
||||||
assignmentEndTime: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => Places, (places) => places.dayAssignments, {
|
|
||||||
onDelete: 'CASCADE',
|
|
||||||
})
|
|
||||||
@JoinColumn([{ name: 'place_id', referencedColumnName: 'id' }])
|
|
||||||
place: Places;
|
|
||||||
|
|
||||||
@ManyToOne(() => Days, (days) => days.dayAssignments, { onDelete: 'CASCADE' })
|
|
||||||
@JoinColumn([{ name: 'day_id', referencedColumnName: 'id' }])
|
|
||||||
day: Days;
|
|
||||||
|
|
||||||
@OneToMany(() => Reservations, (reservations) => reservations.assignment)
|
|
||||||
reservations: Reservations[];
|
|
||||||
|
|
||||||
@OneToMany(
|
|
||||||
() => AssignmentParticipants,
|
|
||||||
(assignmentParticipants) => assignmentParticipants.assignment,
|
|
||||||
)
|
|
||||||
assignmentParticipants: AssignmentParticipants[];
|
|
||||||
|
|
||||||
@OneToMany(() => FileLinks, (fileLinks) => fileLinks.assignment)
|
|
||||||
fileLinks: FileLinks[];
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import { Column, Entity, Index, JoinColumn, ManyToOne } from 'typeorm';
|
|
||||||
import { Trips } from './Trips';
|
|
||||||
import { Days } from './Days';
|
|
||||||
import { IntSortableBaseEntity } from '../base/BaseEntity';
|
|
||||||
|
|
||||||
@Index('idx_day_notes_day_id', ['dayId'], {})
|
|
||||||
@Entity('day_notes')
|
|
||||||
export class DayNotes extends IntSortableBaseEntity {
|
|
||||||
@Column('int', { name: 'day_id' })
|
|
||||||
dayId: number;
|
|
||||||
|
|
||||||
@Column('text', { name: 'text' })
|
|
||||||
text: string;
|
|
||||||
|
|
||||||
@Column({ name: 'time', nullable: true })
|
|
||||||
time: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'icon', nullable: true, default: '📝' })
|
|
||||||
icon: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => Trips, (trips) => trips.dayNotes, { onDelete: 'CASCADE' })
|
|
||||||
@JoinColumn([{ name: 'trip_id', referencedColumnName: 'id' }])
|
|
||||||
trip: Trips;
|
|
||||||
|
|
||||||
@ManyToOne(() => Days, (days) => days.dayNotes, { onDelete: 'CASCADE' })
|
|
||||||
@JoinColumn([{ name: 'day_id', referencedColumnName: 'id' }])
|
|
||||||
day: Days;
|
|
||||||
}
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
import {
|
|
||||||
Column,
|
|
||||||
Entity,
|
|
||||||
Index,
|
|
||||||
JoinColumn,
|
|
||||||
ManyToOne,
|
|
||||||
OneToMany,
|
|
||||||
} from 'typeorm';
|
|
||||||
import { Trips } from './Trips';
|
|
||||||
import { DayAssignments } from './DayAssignments';
|
|
||||||
import { DayNotes } from './DayNotes';
|
|
||||||
import { DayAccommodations } from './DayAccommodations';
|
|
||||||
import { IntBaseEntity } from '../base/BaseEntity';
|
|
||||||
import { Photos } from './journey/Photos';
|
|
||||||
import { Reservations } from './reservation/Reservations';
|
|
||||||
import { ReservationDayPositions } from './reservation/ReservationDayPositions';
|
|
||||||
|
|
||||||
@Index('idx_days_trip_id', ['tripId'], {})
|
|
||||||
@Entity('days')
|
|
||||||
export class Days extends IntBaseEntity {
|
|
||||||
@Column('int', { name: 'trip_id' })
|
|
||||||
tripId: number;
|
|
||||||
|
|
||||||
@Column('int', { name: 'day_number' })
|
|
||||||
dayNumber: number;
|
|
||||||
|
|
||||||
@Column({ name: 'date', nullable: true })
|
|
||||||
date: string | null;
|
|
||||||
|
|
||||||
@Column('text', { name: 'notes', nullable: true })
|
|
||||||
notes: string | null;
|
|
||||||
|
|
||||||
@Column({ name: 'title', nullable: true })
|
|
||||||
title: string | null;
|
|
||||||
|
|
||||||
@ManyToOne(() => Trips, (trips) => trips.days, { onDelete: 'CASCADE' })
|
|
||||||
@JoinColumn([{ name: 'trip_id', referencedColumnName: 'id' }])
|
|
||||||
trip: Trips;
|
|
||||||
|
|
||||||
@OneToMany(() => DayAssignments, (dayAssignments) => dayAssignments.day)
|
|
||||||
dayAssignments: DayAssignments[];
|
|
||||||
|
|
||||||
@OneToMany(() => Photos, (photos) => photos.day)
|
|
||||||
photos: Photos[];
|
|
||||||
|
|
||||||
@OneToMany(() => Reservations, (reservations) => reservations.endDay)
|
|
||||||
reservations: Reservations[];
|
|
||||||
|
|
||||||
@OneToMany(() => Reservations, (reservations) => reservations.day)
|
|
||||||
reservations2: Reservations[];
|
|
||||||
|
|
||||||
@OneToMany(() => DayNotes, (dayNotes) => dayNotes.day)
|
|
||||||
dayNotes: DayNotes[];
|
|
||||||
|
|
||||||
@OneToMany(
|
|
||||||
() => ReservationDayPositions,
|
|
||||||
(reservationDayPositions) => reservationDayPositions.day,
|
|
||||||
)
|
|
||||||
reservationDayPositions: ReservationDayPositions[];
|
|
||||||
|
|
||||||
@OneToMany(
|
|
||||||
() => DayAccommodations,
|
|
||||||
(dayAccommodations) => dayAccommodations.endDay,
|
|
||||||
)
|
|
||||||
dayAccommodations: DayAccommodations[];
|
|
||||||
|
|
||||||
@OneToMany(
|
|
||||||
() => DayAccommodations,
|
|
||||||
(dayAccommodations) => dayAccommodations.startDay,
|
|
||||||
)
|
|
||||||
dayAccommodations2: DayAccommodations[];
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
import { Column, Entity, PrimaryColumn } from 'typeorm';
|
|
||||||
import { TimestampedEntity } from '../base/BaseEntity';
|
|
||||||
|
|
||||||
@Entity('google_place_photo_meta')
|
|
||||||
export class GooglePlacePhotoMeta extends TimestampedEntity {
|
|
||||||
@PrimaryColumn({ name: 'place_id' })
|
|
||||||
placeId: string;
|
|
||||||
|
|
||||||
@Column({ name: 'attribution', nullable: true })
|
|
||||||
attribution: string | null;
|
|
||||||
|
|
||||||
@Column('int', { name: 'fetched_at' })
|
|
||||||
fetchedAt: number;
|
|
||||||
|
|
||||||
@Column('int', { name: 'error_at', nullable: true })
|
|
||||||
errorAt: number | null;
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
import { Column, Entity, PrimaryColumn } from 'typeorm';
|
|
||||||
import { TimestampedEntity } from '../base/BaseEntity';
|
|
||||||
|
|
||||||
@Entity('place_details_cache')
|
|
||||||
export class PlaceDetailsCache extends TimestampedEntity {
|
|
||||||
@PrimaryColumn({ name: 'place_id' })
|
|
||||||
placeId: string;
|
|
||||||
|
|
||||||
@PrimaryColumn({ name: 'lang', default: '' })
|
|
||||||
lang: string;
|
|
||||||
|
|
||||||
@PrimaryColumn('int', { name: 'expanded', default: 0 })
|
|
||||||
expanded: number;
|
|
||||||
|
|
||||||
@Column('simple-json', { name: 'payload_json' })
|
|
||||||
payloadJson: Record<string, unknown>;
|
|
||||||
|
|
||||||
@Column('int', { name: 'fetched_at' })
|
|
||||||
fetchedAt: number;
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user