diff --git a/package-lock.json b/package-lock.json index b733054..2e6c0c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@nestjs/common": "^11.1.6", "@nestjs/core": "^11.0.1", "@nestjs/jwt": "^11.0.1", + "@nestjs/jwt": "^11.0.1", "@nestjs/mapped-types": "*", "@nestjs/passport": "^11.0.5", "@nestjs/platform-express": "^11.0.1", @@ -37,6 +38,7 @@ "@types/express": "^5.0.0", "@types/jest": "^30.0.0", "@types/node": "^22.10.7", + "@types/passport-jwt": "^4.0.1", "@types/supertest": "^6.0.2", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.1", @@ -2424,6 +2426,19 @@ "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0" } }, + "node_modules/@nestjs/jwt": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.1.tgz", + "integrity": "sha512-HXSsc7SAnCnjA98TsZqrE7trGtHDnYXWp4Ffy6LwSmck1QvbGYdMzBquXofX5l6tIRpeY4Qidl2Ti2CVG77Pdw==", + "license": "MIT", + "dependencies": { + "@types/jsonwebtoken": "9.0.10", + "jsonwebtoken": "9.0.2" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0" + } + }, "node_modules/@nestjs/mapped-types": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz", @@ -3008,6 +3023,16 @@ "@types/node": "*" } }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, "node_modules/@types/methods": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", @@ -3028,6 +3053,12 @@ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "license": "MIT" }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, "node_modules/@types/node": { "version": "22.18.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.11.tgz", @@ -3037,6 +3068,38 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/passport": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz", + "integrity": "sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/passport-jwt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-4.0.1.tgz", + "integrity": "sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jsonwebtoken": "*", + "@types/passport-strategy": "*" + } + }, + "node_modules/@types/passport-strategy": { + "version": "0.2.38", + "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz", + "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*", + "@types/passport": "*" + } + }, "node_modules/@types/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", @@ -4449,6 +4512,12 @@ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", "license": "BSD-3-Clause" }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -5230,6 +5299,15 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -7702,6 +7780,49 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -7841,6 +7962,42 @@ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "license": "MIT" }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -7861,6 +8018,12 @@ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "license": "MIT" }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", diff --git a/package.json b/package.json index d8fe952..10962ae 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@nestjs/common": "^11.1.6", "@nestjs/core": "^11.0.1", "@nestjs/jwt": "^11.0.1", + "@nestjs/jwt": "^11.0.1", "@nestjs/mapped-types": "*", "@nestjs/passport": "^11.0.5", "@nestjs/platform-express": "^11.0.1", @@ -48,6 +49,7 @@ "@types/express": "^5.0.0", "@types/jest": "^30.0.0", "@types/node": "^22.10.7", + "@types/passport-jwt": "^4.0.1", "@types/supertest": "^6.0.2", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.1", diff --git a/src/app.module.ts b/src/app.module.ts index 350e497..41cd6c8 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,9 +1,11 @@ import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; -import {ConfigModule} from '@nestjs/config' +import { ConfigModule } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { UsuariosModule } from './usuarios/usuarios.module'; +import { MovimientoModule } from './movimiento/movimiento.module'; +import { EquipoModule } from './equipo/equipo.module'; import { AuthModule } from './auth/auth.module'; @@ -13,21 +15,22 @@ import { AuthModule } from './auth/auth.module'; @Module({ imports: [ ConfigModule.forRoot({ - isGlobal:true, + isGlobal: true, }), TypeOrmModule.forRoot({ - type:'mariadb', - host:process.env.DB_HOST, - port:Number(process.env.DB_PORT), + type: 'mariadb', + host: process.env.DB_HOST, + port: Number(process.env.DB_PORT), username: process.env.DB_USER, password: process.env.DB_PASS, database: process.env.DB_NAME, - autoLoadEntities:true, - synchronize:true, - - + autoLoadEntities: true, + synchronize: true, }), UsuariosModule, + MovimientoModule, + EquipoModule, + UsuariosModule, AuthModule ], controllers: [], diff --git a/src/equipo/dto/create-equipo.dto.ts b/src/equipo/dto/create-equipo.dto.ts new file mode 100644 index 0000000..10f7243 --- /dev/null +++ b/src/equipo/dto/create-equipo.dto.ts @@ -0,0 +1 @@ +export class CreateEquipoDto {} diff --git a/src/equipo/dto/update-equipo.dto.ts b/src/equipo/dto/update-equipo.dto.ts new file mode 100644 index 0000000..c1cb200 --- /dev/null +++ b/src/equipo/dto/update-equipo.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/mapped-types'; +import { CreateEquipoDto } from './create-equipo.dto'; + +export class UpdateEquipoDto extends PartialType(CreateEquipoDto) {} diff --git a/src/equipo/entities/catalogo.entities.ts b/src/equipo/entities/catalogo.entities.ts new file mode 100644 index 0000000..462d5d9 --- /dev/null +++ b/src/equipo/entities/catalogo.entities.ts @@ -0,0 +1,85 @@ +import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from 'typeorm'; +import { Equipo } from './equipo.entity'; + +@Entity() +export class Uso { + @PrimaryGeneratedColumn() + id_tipo_uso: number; + + @Column() + tipo_uso: string; + @OneToMany(() => Equipo, (equipo) => equipo.tipoUso) + equipo: Equipo; +} + +@Entity() +export class Marca { + @PrimaryGeneratedColumn() + id_marca: number; + + @Column() + tipo_marca: string; + + @OneToMany(() => Equipo, (equipo) => equipo.marca) + equipo: Equipo; +} + +@Entity() +export class Estado { + @PrimaryGeneratedColumn() + id_estado: number; + + @Column() + estado: string; + + @OneToMany(() => Equipo, (equipo) => equipo.estado) + equipo: Equipo; +} + +@Entity() +export class Adscripcion { + @PrimaryGeneratedColumn() + id_adscripcion: number; + + @Column() + adscripcion: string; + + @OneToMany(() => Equipo, (equipo) => equipo.adscripcion) + equipo: Equipo; +} + +@Entity() +export class TipoEquipo { + @PrimaryGeneratedColumn() + id_tipo_de_equipo: number; + + @Column() + tipo_equipo: string; + + @OneToMany(() => Equipo, (equipo) => equipo.tipoEquipo) + equipo: Equipo; +} + +@Entity() +export class SistemaOperativo { + @PrimaryGeneratedColumn() + id_sistema_operativo: number; + + @Column() + sistema_operativo: string; + + @OneToMany(() => Equipo, (equipo) => equipo.sistemaOperativo) + equipo: Equipo; +} + +@Entity() +export class Procesador { + @PrimaryGeneratedColumn() + id_procesador: number; + + @Column() + procesador: string; + + @OneToMany(() => Equipo, (equipo) => equipo.procesador) + equipo: Equipo; +} diff --git a/src/equipo/entities/equipo.entity.ts b/src/equipo/entities/equipo.entity.ts new file mode 100644 index 0000000..81ef2be --- /dev/null +++ b/src/equipo/entities/equipo.entity.ts @@ -0,0 +1,65 @@ +import { + Column, + Entity, + ManyToOne, + OneToMany, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { Adscripcion, Estado, Marca, Procesador, SistemaOperativo, TipoEquipo, Uso } from './catalogo.entities'; + + + +@Entity() +export class Equipo { + @PrimaryGeneratedColumn() + id_equipo: number; + + + @Column({ length: 100, nullable: true }) + inventario: string; + + @Column({ length: 100, nullable: true }) + serie: string; + + @ManyToOne(() => Estado, (estado) => estado.equipo) + estado: Estado; + + @ManyToOne(() => Adscripcion, (adscripcion) => adscripcion.equipo) + adscripcion: Adscripcion; + + @Column({ length: 100, nullable: true }) + lugar: string; + + @ManyToOne(() => TipoEquipo, (tipoEquipo) => tipoEquipo.equipo) + tipoEquipo: TipoEquipo; + + @ManyToOne( + () => SistemaOperativo, + (sistemaOperativo) => sistemaOperativo.equipo, + ) + sistemaOperativo: SistemaOperativo; + + @ManyToOne(() => Procesador, (procesador) => procesador.equipo) + procesador: Procesador; + + @ManyToOne(() => Uso, (tipoUso) => tipoUso.equipo) + tipoUso: Uso; + + @Column({ name: 'fecha_factura' }) + fechaFactura: Date; + + @Column({ length: 100, nullable: true }) + antiguedad: string; + + @Column({ length: 100, nullable: true }) + modelo: string; + + @ManyToOne(() => Marca, (marca) => marca.equipo) + marca: Marca; + + @OneToMany(() => Equipo, (equipo) => equipo.marca) + equipo: Equipo; + + +} +} diff --git a/src/equipo/equipo.controller.spec.ts b/src/equipo/equipo.controller.spec.ts new file mode 100644 index 0000000..06db509 --- /dev/null +++ b/src/equipo/equipo.controller.spec.ts @@ -0,0 +1,20 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { EquipoController } from './equipo.controller'; +import { EquipoService } from './equipo.service'; + +describe('EquipoController', () => { + let controller: EquipoController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [EquipoController], + providers: [EquipoService], + }).compile(); + + controller = module.get(EquipoController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/equipo/equipo.controller.ts b/src/equipo/equipo.controller.ts new file mode 100644 index 0000000..4f81371 --- /dev/null +++ b/src/equipo/equipo.controller.ts @@ -0,0 +1,34 @@ +import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; +import { EquipoService } from './equipo.service'; +import { CreateEquipoDto } from './dto/create-equipo.dto'; +import { UpdateEquipoDto } from './dto/update-equipo.dto'; + +@Controller('equipo') +export class EquipoController { + constructor(private readonly equipoService: EquipoService) {} + + @Post() + create(@Body() createEquipoDto: CreateEquipoDto) { + return this.equipoService.create(createEquipoDto); + } + + @Get() + findAll() { + return this.equipoService.findAll(); + } + + @Get(':id') + findOne(@Param('id') id: string) { + return this.equipoService.findOne(+id); + } + + @Patch(':id') + update(@Param('id') id: string, @Body() updateEquipoDto: UpdateEquipoDto) { + return this.equipoService.update(+id, updateEquipoDto); + } + + @Delete(':id') + remove(@Param('id') id: string) { + return this.equipoService.remove(+id); + } +} diff --git a/src/equipo/equipo.module.ts b/src/equipo/equipo.module.ts new file mode 100644 index 0000000..8824b99 --- /dev/null +++ b/src/equipo/equipo.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { EquipoService } from './equipo.service'; +import { EquipoController } from './equipo.controller'; + +@Module({ + controllers: [EquipoController], + providers: [EquipoService], +}) +export class EquipoModule {} diff --git a/src/equipo/equipo.service.spec.ts b/src/equipo/equipo.service.spec.ts new file mode 100644 index 0000000..97dd091 --- /dev/null +++ b/src/equipo/equipo.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { EquipoService } from './equipo.service'; + +describe('EquipoService', () => { + let service: EquipoService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [EquipoService], + }).compile(); + + service = module.get(EquipoService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts new file mode 100644 index 0000000..ce42f11 --- /dev/null +++ b/src/equipo/equipo.service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@nestjs/common'; +import { CreateEquipoDto } from './dto/create-equipo.dto'; +import { UpdateEquipoDto } from './dto/update-equipo.dto'; + +@Injectable() +export class EquipoService { + create(createEquipoDto: CreateEquipoDto) { + return 'This action adds a new equipo'; + } + + findAll() { + return `This action returns all equipo`; + } + + findOne(id: number) { + return `This action returns a #${id} equipo`; + } + + update(id: number, updateEquipoDto: UpdateEquipoDto) { + return `This action updates a #${id} equipo`; + } + + remove(id: number) { + return `This action removes a #${id} equipo`; + } +} diff --git a/src/movimiento/dto/create-movimiento.dto.ts b/src/movimiento/dto/create-movimiento.dto.ts new file mode 100644 index 0000000..646aa18 --- /dev/null +++ b/src/movimiento/dto/create-movimiento.dto.ts @@ -0,0 +1 @@ +export class CreateMovimientoDto {} diff --git a/src/movimiento/dto/update-movimiento.dto.ts b/src/movimiento/dto/update-movimiento.dto.ts new file mode 100644 index 0000000..fe319cf --- /dev/null +++ b/src/movimiento/dto/update-movimiento.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/mapped-types'; +import { CreateMovimientoDto } from './create-movimiento.dto'; + +export class UpdateMovimientoDto extends PartialType(CreateMovimientoDto) {} diff --git a/src/movimiento/entities/movimiento.entity.ts b/src/movimiento/entities/movimiento.entity.ts new file mode 100644 index 0000000..5d8f329 --- /dev/null +++ b/src/movimiento/entities/movimiento.entity.ts @@ -0,0 +1,27 @@ +import { Equipo } from 'src/equipo/entities/equipo.entity'; +import { Usuario } from 'src/usuarios/entities/usuario.entity'; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + ManyToOne, + OneToMany, +} from 'typeorm'; + +@Entity('movimientos') +export class Movimiento { + @PrimaryGeneratedColumn() + id_movimiento: number; + @CreateDateColumn({ name: 'fecha_movimiento' }) + fechaMovimiento: Date; + + @Column({ type: 'text', nullable: true }) + observaciones: string; + + @ManyToOne(() => Usuario, (usuario) => usuario.movimiento) + usuario: Usuario; + + @ManyToOne(() => Equipo, (equipo) => equipo.movimiento) + equipo: Equipo; +} diff --git a/src/movimiento/movimiento.controller.spec.ts b/src/movimiento/movimiento.controller.spec.ts new file mode 100644 index 0000000..757f9e6 --- /dev/null +++ b/src/movimiento/movimiento.controller.spec.ts @@ -0,0 +1,20 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { MovimientoController } from './movimiento.controller'; +import { MovimientoService } from './movimiento.service'; + +describe('MovimientoController', () => { + let controller: MovimientoController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [MovimientoController], + providers: [MovimientoService], + }).compile(); + + controller = module.get(MovimientoController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/movimiento/movimiento.controller.ts b/src/movimiento/movimiento.controller.ts new file mode 100644 index 0000000..16c9c8b --- /dev/null +++ b/src/movimiento/movimiento.controller.ts @@ -0,0 +1,34 @@ +import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; +import { MovimientoService } from './movimiento.service'; +import { CreateMovimientoDto } from './dto/create-movimiento.dto'; +import { UpdateMovimientoDto } from './dto/update-movimiento.dto'; + +@Controller('movimiento') +export class MovimientoController { + constructor(private readonly movimientoService: MovimientoService) {} + + @Post() + create(@Body() createMovimientoDto: CreateMovimientoDto) { + return this.movimientoService.create(createMovimientoDto); + } + + @Get() + findAll() { + return this.movimientoService.findAll(); + } + + @Get(':id') + findOne(@Param('id') id: string) { + return this.movimientoService.findOne(+id); + } + + @Patch(':id') + update(@Param('id') id: string, @Body() updateMovimientoDto: UpdateMovimientoDto) { + return this.movimientoService.update(+id, updateMovimientoDto); + } + + @Delete(':id') + remove(@Param('id') id: string) { + return this.movimientoService.remove(+id); + } +} diff --git a/src/movimiento/movimiento.module.ts b/src/movimiento/movimiento.module.ts new file mode 100644 index 0000000..6d35e2f --- /dev/null +++ b/src/movimiento/movimiento.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { MovimientoService } from './movimiento.service'; +import { MovimientoController } from './movimiento.controller'; + +@Module({ + controllers: [MovimientoController], + providers: [MovimientoService], +}) +export class MovimientoModule {} diff --git a/src/movimiento/movimiento.service.spec.ts b/src/movimiento/movimiento.service.spec.ts new file mode 100644 index 0000000..9a21f72 --- /dev/null +++ b/src/movimiento/movimiento.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { MovimientoService } from './movimiento.service'; + +describe('MovimientoService', () => { + let service: MovimientoService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [MovimientoService], + }).compile(); + + service = module.get(MovimientoService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/movimiento/movimiento.service.ts b/src/movimiento/movimiento.service.ts new file mode 100644 index 0000000..d5241a8 --- /dev/null +++ b/src/movimiento/movimiento.service.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Movimiento } from './entities/movimiento.entity'; +import { Usuario } from 'src/usuarios/entities/usuario.entity'; + +@Injectable() +export class MovimientoService { + constructor( + @InjectRepository(Movimiento) + private movimientoRepository: Repository, + ) {} + + async crearMovimiento( + usuario: Usuario, + camposModificados: string[], + ): Promise { + const movimiento = new Movimiento(); + movimiento.usuario = usuario; + movimiento.observaciones = `Se modificaron los campos: ${camposModificados.join(', ')}`; + + return await this.movimientoRepository.save(movimiento); + } +} diff --git a/src/usuarios/entities/usuario.entity.ts b/src/usuarios/entities/usuario.entity.ts index ff49675..7cdb1d5 100644 --- a/src/usuarios/entities/usuario.entity.ts +++ b/src/usuarios/entities/usuario.entity.ts @@ -1,12 +1,18 @@ -import { Column, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm"; +import { + Column, + Entity, + ManyToOne, + OneToMany, + PrimaryGeneratedColumn, +} from 'typeorm'; @Entity() export class Usuario { - @PrimaryGeneratedColumn() - id_usuario: number + @PrimaryGeneratedColumn() + id_usuario: number; - @Column({length:100, nullable:true}) - nombre:string + @Column({ length: 100, nullable: true }) + nombre: string; @Column({length:100,nullable:true}) contraseƱa:string @@ -18,15 +24,13 @@ export class Usuario { } @Entity() -export class Tipo_Usuario{ - - @PrimaryGeneratedColumn() - id_tipo_usuario:number +export class Tipo_Usuario { + @PrimaryGeneratedColumn() + id_tipo_usuario: number; @Column({length:50, nullable:true}) tipo_usuario:string - @OneToMany(()=>Usuario,usuarios=>usuarios.tipoUsuario) - usuarios:Usuario[]; - -} \ No newline at end of file + @OneToMany(() => Usuario, (usuarios) => usuarios.tipoUsuario) + usuarios: Usuario[]; +}