chore(repo): multiple datasources

This commit is contained in:
Francesco Spilla 2025-03-18 14:13:05 +01:00
parent 577f781556
commit 2c313a0dd0
26 changed files with 759 additions and 48 deletions

View File

@ -1,6 +1,6 @@
import { Body, Controller, HttpCode, HttpStatus, Post, UnauthorizedException, UseGuards } from '@nestjs/common';
import { ApiBearerAuth } from '@nestjs/swagger';
import { AccountsEntity } from '../database/entities';
import { AccountsEntity } from '../database/connections/ebitemp-api/entities';
import { LoginDto, LoginResDto } from './auth.dto';
import { AuthService } from './auth.service';
import { AuthenticatedUser } from './authenticated-user.decorator';
@ -17,7 +17,7 @@ export class AuthController {
async logIn(@Body() body: LoginDto): Promise<LoginResDto> {
const { username, password } = body;
const user = await this.authService.getAuthenticatedUser(username, password);
const { accessToken, refreshToken } = await this.authService.signJwts(user);
return {
accessToken: accessToken,

View File

@ -1,6 +1,6 @@
import { createZodDto } from '@anatine/zod-nestjs';
import { z } from 'zod';
import { AccountsEntitySchema } from '../database/entities';
import { AccountsEntitySchema } from '../database/connections/ebitemp-api/entities';
export const loginSchema = z.object({
username: AccountsEntitySchema.shape.username,

View File

@ -2,7 +2,7 @@ import { Module } from '@nestjs/common';
import { APP_GUARD, Reflector } from '@nestjs/core';
import { PassportModule } from '@nestjs/passport';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AccountsEntity } from '../database/entities';
import { AccountsEntity } from '../database/connections/ebitemp-api/entities';
import { AuthController } from './auth.controller';
import { AuthService } from './auth.service';
import { JwtAccessTokenAuthStrategy } from './strategies/jwt/jwt-access-token-auth.strategy';

View File

@ -2,7 +2,7 @@ import { Inject, Injectable, Logger, UnauthorizedException } from '@nestjs/commo
import { JwtService } from '@nestjs/jwt';
import * as bcrypt from 'bcrypt';
import { isEmpty } from 'lodash';
import { AccountsEntity } from '../database/entities';
import { AccountsEntity } from '../database/connections/ebitemp-api/entities';
import { ACCESS_TOKEN_JWT_SERVICE } from './strategies/jwt/jwt-access-token.module';
import { REFRESH_TOKEN_JWT_SERVICE } from './strategies/jwt/jwt-refresh-token.module';
import { UsersAuthService } from './users/users-auth.service';

View File

@ -1,5 +1,5 @@
import { FastifyRequest } from "fastify";
import { AccountsEntity } from "../../database/entities";
import { AccountsEntity } from "../../database/connections/ebitemp-api/entities";
export interface RequestWithUser extends FastifyRequest {
user: AccountsEntity;

View File

@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import bcrypt from 'bcrypt';
import { Repository } from 'typeorm';
import { AccountsEntity } from '../../database/entities';
import { AccountsEntity } from '../../database/connections/ebitemp-api/entities';
@Injectable()
export class UsersAuthService {

View File

@ -2,7 +2,7 @@
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersAuthService } from './users-auth.service';
import { AccountsEntity } from '../../database/entities';
import { AccountsEntity } from '../../database/connections/ebitemp-api/entities';
@Module({
imports: [TypeOrmModule.forFeature([AccountsEntity])],

View File

@ -0,0 +1,10 @@
import coerceRecordTypes from '../../../config/utils/coerce-record-types';
import { databaseConfigFactory, rawDatabaseSchema } from '../../utils/database-config';
const env = coerceRecordTypes(process.env);
const envParsed = rawDatabaseSchema.strict().parse({
connectionString: env['DATABASE_EBITEMPAPI_CONNECTION_STRING'],
secure: env['DATABASE_EBITEMPAPI_SECURE'],
});
export const databaseConfig = databaseConfigFactory(envParsed);

View File

@ -0,0 +1,29 @@
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { DatabaseConfig } from '../../utils/database-config';
import { typeormTransactionalDataSourceFactory } from '../../utils/typeorm-data-source-factory';
import { typeormEntitiesFromImport } from '../../utils/typeorm-import-entities';
import { typeormModuleOptionsFactory } from '../../utils/typeorm-module-options-factory';
import { databaseConfig } from './database.config';
@Module({
imports: [
ConfigModule.forFeature(databaseConfig),
TypeOrmModule.forRootAsync({
imports: databaseConfig.asProvider().imports,
dataSourceFactory: typeormTransactionalDataSourceFactory(),
useFactory: async (dbConfig: DatabaseConfig) => {
const config = await typeormModuleOptionsFactory(
dbConfig,
await typeormEntitiesFromImport(await import('./index'))
);
return config;
},
inject: [databaseConfig.KEY],
}),
],
providers: [],
exports: [TypeOrmModule],
})
export class EbitempApiDatabaseModule {}

View File

@ -1,5 +1,5 @@
import { Column, Entity, Index } from 'typeorm';
import { Enumify } from '../../enumify/enumify';
import { Enumify } from '../../../../enumify/enumify';
export class InviaMailSeErrori {
@Column('bit', { name: 'flag', default: () => '(0)' })

View File

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

View File

@ -0,0 +1,10 @@
import coerceRecordTypes from '../../../config/utils/coerce-record-types';
import { databaseConfigFactory, rawDatabaseSchema } from '../../utils/database-config';
const env = coerceRecordTypes(process.env);
const envParsed = rawDatabaseSchema.strict().parse({
connectionString: env['DATABASE_OCEANO_CONNECTION_STRING'],
secure: env['DATABASE_OCEANO_SECURE'],
});
export const databaseConfig = databaseConfigFactory(envParsed);

View File

@ -0,0 +1,29 @@
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { DatabaseConfig } from '../../utils/database-config';
import { typeormTransactionalDataSourceFactory } from '../../utils/typeorm-data-source-factory';
import { typeormEntitiesFromImport } from '../../utils/typeorm-import-entities';
import { typeormModuleOptionsFactory } from '../../utils/typeorm-module-options-factory';
import { databaseConfig } from './database.config';
@Module({
imports: [
ConfigModule.forFeature(databaseConfig),
TypeOrmModule.forRootAsync({
imports: databaseConfig.asProvider().imports,
dataSourceFactory: typeormTransactionalDataSourceFactory(),
useFactory: async (dbConfig: DatabaseConfig) => {
const config = await typeormModuleOptionsFactory(
dbConfig,
await typeormEntitiesFromImport(await import('./index'))
);
return config;
},
inject: [databaseConfig.KEY],
}),
],
providers: [],
exports: [TypeOrmModule],
})
export class OceanoDatabaseModule {}

View File

@ -0,0 +1,653 @@
import { Column, Entity, Index, JoinColumn, ManyToOne, OneToMany } from 'typeorm';
@Index('PK_gruppo', ['codiceGruppo'], { unique: true })
@Entity('gruppo')
export class GruppoEntity {
@Column('bigint', { primary: true, name: 'codiceGruppo' })
codiceGruppo!: string;
@Column('nvarchar', { name: 'gruppo', nullable: true, length: 80 })
gruppo!: string | null;
@Column('nvarchar', {
name: 'descrizioneGruppo',
nullable: true,
length: 255,
})
descrizioneGruppo!: string | null;
@Column('ntext', { name: 'noteGruppo', nullable: true })
noteGruppo!: string | null;
@Column('nvarchar', { name: 'referenteGruppo', nullable: true, length: 80 })
referenteGruppo!: string | null;
@Column('nvarchar', { name: 'telefonoReferente', nullable: true, length: 80 })
telefonoReferente!: string | null;
@Column('nvarchar', {
name: 'cellulareReferente',
nullable: true,
length: 80,
})
cellulareReferente!: string | null;
@Column('nvarchar', { name: 'emailReferente', nullable: true, length: 80 })
emailReferente!: string | null;
@Column('nvarchar', { name: 'indirizzoGruppo', nullable: true, length: 80 })
indirizzoGruppo!: string | null;
@Column('nvarchar', {
name: 'numeroCivicoGruppo',
nullable: true,
length: 80,
})
numeroCivicoGruppo!: string | null;
@Column('nvarchar', { name: 'capGruppo', nullable: true, length: 10 })
capGruppo!: string | null;
@Column('nvarchar', { name: 'localitaGruppo', nullable: true, length: 80 })
localitaGruppo!: string | null;
@Column('nvarchar', { name: 'telefono1Gruppo', nullable: true, length: 80 })
telefono1Gruppo!: string | null;
@Column('nvarchar', { name: 'telefono2Gruppo', nullable: true, length: 80 })
telefono2Gruppo!: string | null;
@Column('nvarchar', { name: 'faxGruppo', nullable: true, length: 80 })
faxGruppo!: string | null;
@Column('nvarchar', { name: 'emailGruppo', nullable: true, length: 80 })
emailGruppo!: string | null;
@Column('nvarchar', { name: 'sitoWebGruppo', nullable: true, length: 80 })
sitoWebGruppo!: string | null;
@Column('int', { name: 'gruppoAttivo', nullable: true })
gruppoAttivo!: number | null;
@Column('int', { name: 'esolverAttivo', nullable: true })
esolverAttivo!: number | null;
@Column('nvarchar', { name: 'serverEsolver', nullable: true, length: 80 })
serverEsolver!: string | null;
@Column('nvarchar', { name: 'databaseEsolver', nullable: true, length: 80 })
databaseEsolver!: string | null;
@Column('nvarchar', { name: 'usernameEsolver', nullable: true, length: 80 })
usernameEsolver!: string | null;
@Column('nvarchar', { name: 'passwordEsolver', nullable: true, length: 80 })
passwordEsolver!: string | null;
@Column('nvarchar', { name: 'gruppoEsolver', nullable: true, length: 80 })
gruppoEsolver!: string | null;
@Column('image', { name: 'logoGruppo', nullable: true })
logoGruppo!: Buffer | null;
@Column('bigint', { name: 'utenteCreazione', nullable: true })
utenteCreazione!: string | null;
@Column('nvarchar', { name: 'dataCreazione', nullable: true, length: 10 })
dataCreazione!: string | null;
@Column('nvarchar', { name: 'oraCreazione', nullable: true, length: 8 })
oraCreazione!: string | null;
@Column('bigint', { name: 'utenteModifica', nullable: true })
utenteModifica!: string | null;
@Column('nvarchar', { name: 'dataModifica', nullable: true, length: 10 })
dataModifica!: string | null;
@Column('nvarchar', { name: 'oraModifica', nullable: true, length: 8 })
oraModifica!: string | null;
@Column('nvarchar', { name: 'direttivaReport', nullable: true, length: 512 })
direttivaReport!: string | null;
@Column('nvarchar', {
name: 'direttivaReportPers',
nullable: true,
length: 512,
})
direttivaReportPers!: string | null;
@Column('bigint', { name: 'statoGruppo', nullable: true })
statoGruppo!: string | null;
@Column('bigint', { name: 'provinciaGruppo', nullable: true })
provinciaGruppo!: string | null;
@Column('int', { name: 'fondo', nullable: true })
fondo!: number | null;
@Column('decimal', {
name: 'tassaIscrizione',
nullable: true,
precision: 18,
scale: 2,
})
tassaIscrizione!: number | null;
@Column('nvarchar', { name: 'codiceFiscale', nullable: true, length: 80 })
codiceFiscale!: string | null;
@Column('nvarchar', { name: 'serverFTP', nullable: true, length: 200 })
serverFtp!: string | null;
@Column('nvarchar', { name: 'usernameFTP', nullable: true, length: 200 })
usernameFtp!: string | null;
@Column('nvarchar', { name: 'passwordFTP', nullable: true, length: 200 })
passwordFtp!: string | null;
@Column('decimal', {
name: 'massimalePresaCarico',
nullable: true,
precision: 18,
scale: 2,
})
massimalePresaCarico!: number | null;
@Column('nvarchar', { name: 'elencoLivello1', nullable: true, length: 80 })
elencoLivello1!: string | null;
@Column('ntext', { name: 'testoEmailPreventivo', nullable: true })
testoEmailPreventivo!: string | null;
@Column('nvarchar', {
name: 'emailPreventivoMittente',
nullable: true,
length: 80,
})
emailPreventivoMittente!: string | null;
@Column('nvarchar', {
name: 'emailPreventivoNotifica',
nullable: true,
length: 80,
})
emailPreventivoNotifica!: string | null;
@Column('nvarchar', {
name: 'desPreventivoMittente',
nullable: true,
length: 80,
})
desPreventivoMittente!: string | null;
@Column('nvarchar', {
name: 'desPreventivoNotifica',
nullable: true,
length: 80,
})
desPreventivoNotifica!: string | null;
@Column('bigint', { name: 'codiceContrattoIndividuali', nullable: true })
codiceContrattoIndividuali!: string | null;
@Column('nvarchar', {
name: 'codiceAziendaBollettini',
nullable: true,
length: 80,
})
codiceAziendaBollettini!: string | null;
@Column('nvarchar', { name: 'rigaTesserino1', nullable: true, length: 80 })
rigaTesserino1!: string | null;
@Column('nvarchar', { name: 'rigaTesserino2', nullable: true, length: 80 })
rigaTesserino2!: string | null;
@Column('nvarchar', { name: 'rigaTesserino3', nullable: true, length: 80 })
rigaTesserino3!: string | null;
@Column('nvarchar', {
name: 'cartellaCondivisa',
nullable: true,
length: 512,
})
cartellaCondivisa!: string | null;
@Column('nvarchar', { name: 'serverSMTP', nullable: true, length: 80 })
serverSmtp!: string | null;
@Column('nvarchar', { name: 'usernameSMTP', nullable: true, length: 80 })
usernameSmtp!: string | null;
@Column('nvarchar', { name: 'passwordSMTP', nullable: true, length: 80 })
passwordSmtp!: string | null;
@Column('nvarchar', { name: 'emailIBAN', nullable: true, length: 255 })
emailIban!: string | null;
@Column('nvarchar', { name: 'emailFatture', nullable: true, length: 255 })
emailFatture!: string | null;
@Column('nvarchar', { name: 'emailRA', nullable: true, length: 255 })
emailRa!: string | null;
@Column('nvarchar', {
name: 'emailAreaRiservataSoci',
nullable: true,
length: 80,
default: () => "''",
})
emailAreaRiservataSoci!: string | null;
@Column('nvarchar', {
name: 'desAreaRiservataSoci',
nullable: true,
length: 80,
default: () => "''",
})
desAreaRiservataSoci!: string | null;
@Column('nvarchar', {
name: 'usernameSMS',
nullable: true,
length: 255,
default: () => "''",
})
usernameSms!: string | null;
@Column('nvarchar', {
name: 'passwordSMS',
nullable: true,
length: 255,
default: () => "''",
})
passwordSms!: string | null;
@Column('nvarchar', {
name: 'mittenteSMS',
nullable: true,
length: 255,
default: () => "''",
})
mittenteSms!: string | null;
@Column('nvarchar', { name: 'sitoWebDati', length: 255, default: () => "''" })
sitoWebDati!: string;
@Column('nvarchar', {
name: 'identificativoCreditore',
length: 35,
default: () => "''",
})
identificativoCreditore!: string;
@Column('nvarchar', {
name: 'SMSProtocollo',
nullable: true,
length: 200,
default: () => "''",
})
smsProtocollo!: string | null;
@Column('nvarchar', {
name: 'oggettoEmailBonifico',
nullable: true,
length: 200,
default: () => "''",
})
oggettoEmailBonifico!: string | null;
@Column('ntext', {
name: 'emailBonifico',
nullable: true,
default: () => "''",
})
emailBonifico!: string | null;
@Column('ntext', {
name: 'emailAssegno',
nullable: true,
default: () => "''",
})
emailAssegno!: string | null;
@Column('nvarchar', {
name: 'oggettoEmailAssegno',
nullable: true,
length: 200,
default: () => "''",
})
oggettoEmailAssegno!: string | null;
@Column('nvarchar', {
name: 'SMSRimborsoBonifico',
nullable: true,
length: 200,
default: () => "''",
})
smsRimborsoBonifico!: string | null;
@Column('nvarchar', {
name: 'SMSRimborsoAssegno',
nullable: true,
length: 200,
default: () => "''",
})
smsRimborsoAssegno!: string | null;
@Column('nvarchar', { name: 'emailPIC', nullable: true, length: 255 })
emailPic!: string | null;
@Column('nvarchar', { name: 'stelline', length: 10, default: () => "''" })
stelline!: string;
@Column('nvarchar', { name: 'mittentePIC', length: 400, default: () => "''" })
mittentePic!: string;
@Column('ntext', { name: 'oggettoPIC', default: () => "''" })
oggettoPic!: string;
@Column('ntext', { name: 'messaggioPIC', default: () => "''" })
messaggioPic!: string;
@Column('nvarchar', {
name: 'nomeSupportoContrattoPosta',
nullable: true,
length: 80,
default: () => "''",
})
nomeSupportoContrattoPosta!: string | null;
@Column('nvarchar', {
name: 'codiceContrattoPosta',
nullable: true,
length: 80,
default: () => "''",
})
codiceContrattoPosta!: string | null;
@Column('nvarchar', {
name: 'passwordContrattoPosta',
nullable: true,
length: 80,
default: () => "''",
})
passwordContrattoPosta!: string | null;
@Column('bigint', {
name: 'codiceSpedizione',
nullable: true,
default: () => '(0)',
})
codiceSpedizione!: string | null;
@Column('nvarchar', {
name: 'oggettoEmailBonificoDomiciliato',
nullable: true,
length: 200,
default: () => "''",
})
oggettoEmailBonificoDomiciliato!: string | null;
@Column('ntext', {
name: 'emailBonificoDomiciliato',
nullable: true,
default: () => "''",
})
emailBonificoDomiciliato!: string | null;
@Column('nvarchar', {
name: 'SMSRimborsoBonificoDomiciliato',
nullable: true,
length: 200,
default: () => "''",
})
smsRimborsoBonificoDomiciliato!: string | null;
@Column('int', { name: 'notifichePush', default: () => '(0)' })
notifichePush!: number;
@Column('int', { name: 'controlloCodiceFiscale', default: () => '(-1)' })
controlloCodiceFiscale!: number;
@Column('ntext', { name: 'emailSuperamentoPIC', default: () => "''" })
emailSuperamentoPic!: string;
@Column('nvarchar', {
name: 'SMSProtocolloNotificaEsplicita',
length: 200,
default: () => "''",
})
smsProtocolloNotificaEsplicita!: string;
@Column('nvarchar', {
name: 'mittenteSportello',
length: 200,
default: () => "''",
})
mittenteSportello!: string;
@Column('nvarchar', {
name: 'oggettoEmailBonificoDomiciliatoSportello',
length: 200,
default: () => "''",
})
oggettoEmailBonificoDomiciliatoSportello!: string;
@Column('ntext', {
name: 'emailBonificoDomiciliatoSportello',
default: () => "''",
})
emailBonificoDomiciliatoSportello!: string;
@Column('nvarchar', {
name: 'oggettoEmailBonificoSportello',
length: 200,
default: () => "''",
})
oggettoEmailBonificoSportello!: string;
@Column('ntext', { name: 'emailBonificoSportello', default: () => "''" })
emailBonificoSportello!: string;
@Column('nvarchar', {
name: 'oggettoEmailSospensioneSportello',
length: 200,
default: () => "''",
})
oggettoEmailSospensioneSportello!: string;
@Column('ntext', { name: 'emailSospensioneSportello', default: () => "''" })
emailSospensioneSportello!: string;
@Column('nvarchar', {
name: 'oggettoEmailRespingimentoSportello',
length: 200,
default: () => "''",
})
oggettoEmailRespingimentoSportello!: string;
@Column('ntext', { name: 'emailRespingimentoSportello', default: () => "''" })
emailRespingimentoSportello!: string;
@Column('nvarchar', {
name: 'oggettoEmailSospensione',
length: 200,
default: () => "''",
})
oggettoEmailSospensione!: string;
@Column('ntext', { name: 'emailSospensione', default: () => "''" })
emailSospensione!: string;
@Column('nvarchar', {
name: 'oggettoEmailRespingimento',
length: 200,
default: () => "''",
})
oggettoEmailRespingimento!: string;
@Column('ntext', { name: 'emailRespingimento', default: () => "''" })
emailRespingimento!: string;
@Column('nvarchar', {
name: 'mittentePICdisdetta',
nullable: true,
length: 400,
})
mittentePiCdisdetta!: string | null;
@Column('ntext', { name: 'oggettoPICdisdetta', nullable: true })
oggettoPiCdisdetta!: string | null;
@Column('ntext', { name: 'messaggioPICdisdetta', nullable: true })
messaggioPiCdisdetta!: string | null;
@Column('int', { name: 'modalitaMassimaleBonifico', default: () => '(0)' })
modalitaMassimaleBonifico!: number;
@Column('nvarchar', { name: 'portaSMTP', length: 10, default: () => "''" })
portaSmtp!: string;
@Column('int', { name: 'useSSL', default: () => '(0)' })
useSsl!: number;
@Column('nvarchar', {
name: 'serverSMTPSpot',
length: 200,
default: () => "''",
})
serverSmtpSpot!: string;
@Column('nvarchar', {
name: 'usernameSMTPSpot',
length: 200,
default: () => "''",
})
usernameSmtpSpot!: string;
@Column('nvarchar', {
name: 'passwordSMTPSpot',
length: 200,
default: () => "''",
})
passwordSmtpSpot!: string;
@Column('nvarchar', {
name: 'portaSMTPSpot',
length: 10,
default: () => "''",
})
portaSmtpSpot!: string;
@Column('int', { name: 'useSSLSpot', default: () => '(0)' })
useSslSpot!: number;
@Column('nvarchar', {
name: 'cartellaPubblicazioneLocale',
length: 512,
default: () => "''",
})
cartellaPubblicazioneLocale!: string;
@Column('int', { name: 'portaFTP', default: () => '(0)' })
portaFtp!: number;
@Column('nvarchar', {
name: 'cartellaAllegatiFTP',
length: 200,
default: () => "''",
})
cartellaAllegatiFtp!: string;
@Column('nvarchar', {
name: 'mittentiEmailNotificaEmissioneRimborsoSocio',
nullable: true,
length: 80,
})
mittentiEmailNotificaEmissioneRimborsoSocio!: string | null;
@Column('nvarchar', {
name: 'mittentiEmailInvioAllegatiPraticaSocio',
nullable: true,
length: 80,
})
mittentiEmailInvioAllegatiPraticaSocio!: string | null;
@Column('nvarchar', {
name: 'mittentiEmailRichiestaDatiBancariSocio',
nullable: true,
length: 80,
})
mittentiEmailRichiestaDatiBancariSocio!: string | null;
@Column('nvarchar', {
name: 'mittentiEmailLettereRichiestaContributiRinnoviIndividuali',
nullable: true,
length: 80,
})
mittentiEmailLettereRichiestaContributiRinnoviIndividuali!: string | null;
@Column('nvarchar', {
name: 'mittentiEmailLettereSoci',
nullable: true,
length: 80,
})
mittentiEmailLettereSoci!: string | null;
@Column('nvarchar', {
name: 'mittentiEmailLettereStrutture',
nullable: true,
length: 80,
})
mittentiEmailLettereStrutture!: string | null;
@Column('nvarchar', {
name: 'mittentiEmailLettereContratti',
nullable: true,
length: 80,
})
mittentiEmailLettereContratti!: string | null;
@Column('nvarchar', {
name: 'emailNotificaCodiciFiscaliDoppiMittente',
nullable: true,
length: 80,
})
emailNotificaCodiciFiscaliDoppiMittente!: string | null;
@Column('nvarchar', {
name: 'emailNotificaCodiciFiscaliDoppiDestinatari',
nullable: true,
length: 80,
})
emailNotificaCodiciFiscaliDoppiDestinatari!: string | null;
@Column('nvarchar', {
name: 'emailNotificaCodiciFiscaliDoppiCc',
nullable: true,
length: 200,
})
emailNotificaCodiciFiscaliDoppiCc!: string | null;
@Column('nvarchar', {
name: 'oggettoEmailRichiestaDatiBancari',
length: 200,
default: () => "''",
})
oggettoEmailRichiestaDatiBancari!: string;
@Column('ntext', { name: 'emailRichiestaDatiBancari', default: () => "''" })
emailRichiestaDatiBancari!: string;
@Column('int', {
name: 'flagAllegaModuloIbanEmailRichiestaDatiBancari',
nullable: true,
})
flagAllegaModuloIbanEmailRichiestaDatiBancari!: number | null;
constructor(init?: Partial<GruppoEntity>) {
Object.assign(this, init);
}
}

View File

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

View File

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

View File

@ -1,36 +1,19 @@
import { Global, Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { DataSource } from 'typeorm';
import { DatabaseConfig, databaseConfig } from './database.config';
import { APP_DATASOURCES } from './database.constants';
import { typeormTransactionalDataSourceFactory } from './utils/typeorm-data-source-factory';
import { typeormModuleOptionsFactory } from './utils/typeorm-module-options-factory';
import { typeormEntitiesFromImport } from './utils/typeorm-import-entities';
const dataSources: DataSource[] = [];
const typeormModules = [
TypeOrmModule.forRootAsync({
imports: databaseConfig.asProvider().imports,
dataSourceFactory: typeormTransactionalDataSourceFactory(),
useFactory: async (dbConfig: DatabaseConfig) => {
const config = await typeormModuleOptionsFactory(dbConfig, await typeormEntitiesFromImport(await import('./entities')));
return config;
},
inject: [databaseConfig.KEY],
}),
];
import { EbitempApiDatabaseModule } from './connections/ebitemp-api/database.module';
import { dataSources } from './utils/typeorm-data-source-factory';
const dataSourcesProvider = {
provide: APP_DATASOURCES,
useValue: dataSources,
};
const databaseModules = [EbitempApiDatabaseModule];
@Global()
@Module({
imports: [ConfigModule.forFeature(databaseConfig), ...typeormModules],
imports: [...databaseModules],
providers: [dataSourcesProvider],
exports: [...typeormModules, dataSourcesProvider],
exports: [dataSourcesProvider, ...databaseModules],
})
export class AppDatabaseModule {}

View File

@ -2,7 +2,6 @@ import { registerAs } from '@nestjs/config';
import { ConnectionString } from 'connection-string';
import { first } from 'lodash';
import { z } from 'zod';
import coerceRecordTypes from '../config/utils/coerce-record-types';
export const databaseSchema = z.object({
connectionString: z.string(),
@ -34,21 +33,16 @@ export const databaseSchema = z.object({
database: z.string(),
secure: z.boolean(),
});
export type DatabaseConfig = z.TypeOf<typeof databaseSchema>;
const rawDatabaseSchema = z.object({
export const rawDatabaseSchema = z.object({
connectionString: z.string(),
secure: z.boolean().default(true),
});
export type RawDatabaseConfigSchema = z.TypeOf<typeof rawDatabaseSchema>;
export const databaseConfig = registerAs('database', () => {
const env = coerceRecordTypes(process.env);
const envParsed = rawDatabaseSchema.strict().parse({
connectionString: env['DATABASE_CONNECTION_STRING'],
secure: env['DATABASE_SECURE'],
});
const connectionString = new ConnectionString(envParsed.connectionString);
export const databaseConfigFactory = (opts: RawDatabaseConfigSchema) => registerAs('database', () => {
const connectionString = new ConnectionString(opts.connectionString);
const config: DatabaseConfig = databaseSchema.strict().parse({
connectionString: connectionString.toString(),
type: connectionString.protocol,
@ -57,7 +51,7 @@ export const databaseConfig = registerAs('database', () => {
username: connectionString.user,
password: connectionString.password,
database: first(connectionString.path),
secure: envParsed.secure,
secure: opts.secure,
});
return config;
});

View File

@ -1,6 +1,6 @@
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
import { DatabaseConfig } from '../database.config';
import { SnakeNamingStrategy } from 'typeorm-naming-strategies';
import { DatabaseConfig } from './database-config';
export const typeormModuleOptionsFactory = async (
databaseConfig: DatabaseConfig,

View File

@ -3,7 +3,7 @@ import { registerAs } from '@nestjs/config';
import { z } from 'zod';
export const enumifySchema = z.object({
shouldUpdateEnumFromDbOnStartup: z.boolean().default(false),
shouldUpdateEnumFromDbOnStartup: z.boolean().default(true),
});
export type EnumifyConfig = z.infer<typeof enumifySchema>;

View File

@ -1,7 +1,7 @@
import { Module } from '@nestjs/common';
import { ScheduleModule } from '@nestjs/schedule';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TipiJobsEntity } from '../database/entities';
import { TipiJobsEntity } from '../database/connections/ebitemp-api/entities';
import { SchedulerService } from './schedule.service';
@Module({

View File

@ -3,7 +3,7 @@ import { SchedulerRegistry } from '@nestjs/schedule';
import { InjectRepository } from '@nestjs/typeorm';
import { CronJob, CronTime } from 'cron';
import { Repository } from 'typeorm';
import { TipiJobsEntity } from '../database/entities/tipi_jobs.entity';
import { TipiJobsEntity } from '../database/connections/ebitemp-api/entities/tipi_jobs.entity';
import { isError } from '@stdlib/assert';
@Injectable()