Aller au contenu principal

35-1 Modification de l'entité issue (ORM)

Vous devriez déjà avoir une entité vide pour Issue, puisque dans le niveau Premier module nous avons créé la ressource Issue à l'aide du raccourci nest g resource.

On doit cependant bonifier cette entité pour qu'elle contienne les différentes propriétés requises.

Ajouter les propriétés de base à l'entité Issue

Peu de surprises ici, on ajoute les propriétés d'une Issue. Seule particularité, on associe statut à un enum pour s'assurer que la valeur associée correspond aux deux possibilités: Open ou Closed.

src/issues/entities/issue.entity.ts
export enum Statut {
OPEN = "open",
ASSIGNED = "assigned",
CLOSED = "closed",
}

export class Issue {
id: number;
titre: string;
contenu: string;
image_url?: string;
statut: Statut;
date_creation: string;
date_modification: string;
}
info

On ne gère pas l'auteur pour l'instant, nous allons gérer cet aspect dans les prochains niveaux.

Configurer Issue pour utilisation avec TypeORM

Ensuite, pour que l'entité puisse être gérée par TypeORM, on ajoute:

  • Le décorateur @Entity() qui précise le nom de la table (issues)
  • On fait hériter la classe de BaseEntity
src/issues/entities/issue.entity.ts
@Entity('issues')
export class Issue extends BaseEntity {
id: number;
titre: string;
contenu: string;
imageUrl?: string;
statut: string;
date_creation: string;
date_modification: string;
}

Définir les colonnes

Maintenant, on peut définir les différentes colonnes.

src/issues/entities/issue.entity.ts
export enum Statut {
OPEN = "Open",
CLOSED = "Closed",
}

@Entity('issues')
export class Issue extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;

@Column()
titre: string;

@Column({ type: 'text' })
contenu: string;

@Column({ nullable: true })
imageUrl?: string;

@Column({
type: "enum",
enum: Statut,
default: Statut.OPEN,
})
statut: string;

@CreateDateColumn()
date_creation: string;

@UpdateDateColumn()
date_modification: string;
}

Ajout de l'entité à la configuration de TypeORM

Finalement, on ajoute l'entité à la liste d'entités (tableau entities) gérées par TypeORM:

src/app.module.ts
@Module({
imports: [
ConfigModule.forRoot(),
ProjetsModule,
IssuesModule,
TypeOrmModule.forRoot({
type: 'postgres',
host: process.env.DATABASE_HOST,
port: +process.env.DATABASE_PORT,
username: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
database: process.env.DATABASE_NAME,
entities: [Projet, Issue],
synchronize: true,
logging: true,
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}

Vérification de la création de la table

Suite à cette modification, vous devriez voir dans la console de Nest l'exécution d'une requête SQL de création de table.

CREATE TABLE "issues" ("id" SERIAL NOT NULL, "titre" character varying NOT NULL, "contenu" text NOT NULL, "image_url" character varying, "statut" "public"."issues_statut_enum" NOT NULL DEFAULT 'open', "date_creation" TIMESTAMP NOT NULL DEFAULT now(), "date_modification" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_9d8ecbbeff46229c700f0449257" PRIMARY KEY ("id"))

Vous pouvez aussi confirmer dans PgAdmin que vous voyez bien la table et ses différentes colonnes.