Overview
The Genero interface represents a book genre or category in the virtual library system. Each book belongs to exactly one genre.
Interface Definition
export interface Genero {
id: number;
nombre: string;
}
Properties
Unique identifier for the genre. Auto-generated by the backend.
The genre name (e.g., “Ficción”, “No Ficción”, “Ciencia Ficción”, “Romance”, “Misterio”).
Usage Examples
Fetching All Genres
import { GeneroService } from './core/services/genero';
import { Genero } from './core/models/genero';
this.generoService.getAll().subscribe({
next: (generos: Genero[]) => {
generos.forEach(genero => {
console.log(`${genero.nombre} (ID: ${genero.id})`);
});
},
error: (err) => console.error('Error fetching genres:', err)
});
Creating a New Genre
const nuevoGenero: Genero = {
id: 0, // Will be assigned by backend
nombre: 'Ciencia Ficción'
};
this.generoService.create(nuevoGenero).subscribe({
next: (genero: Genero) => {
console.log('Genre created with ID:', genero.id);
},
error: (err) => console.error('Error creating genre:', err)
});
Updating a Genre
this.generoService.getById(1).subscribe({
next: (genero: Genero) => {
const generoActualizado: Genero = {
...genero,
nombre: 'Ciencia Ficción y Fantasía'
};
this.generoService.update(genero.id, generoActualizado).subscribe({
next: (updated) => console.log('Genre updated:', updated),
error: (err) => console.error('Update failed:', err)
});
}
});
Deleting a Genre
this.generoService.delete(generoId).subscribe({
next: (response) => {
console.log('Genre deleted:', response);
},
error: (err) => {
console.error('Delete failed:', err);
// Note: May fail if genre is associated with existing books
}
});
Using Genres in Book Management
import { Libro } from './core/models/libro';
// Load genres for a dropdown selector
generos: Genero[] = [];
selectedGenero: Genero | null = null;
ngOnInit() {
this.loadGeneros();
}
loadGeneros() {
this.generoService.getAll().subscribe({
next: (data) => {
this.generos = data;
},
error: (err) => {
console.error('Error loading genres:', err);
}
});
}
createBook() {
if (!this.selectedGenero) {
console.error('Please select a genre');
return;
}
const nuevoLibro = {
titulo: 'El nombre del viento',
genero: this.selectedGenero,
autores: [/* ... */],
disponible: true
};
this.libroService.create(nuevoLibro).subscribe({
next: (libro) => console.log('Book created:', libro),
error: (err) => console.error('Error:', err)
});
}
Filtering Books by Genre
getBooksByGenre(generoId: number) {
this.libroService.getAll().subscribe({
next: (libros: Libro[]) => {
const librosPorGenero = libros.filter(
libro => libro.genero.id === generoId
);
console.log(`Found ${librosPorGenero.length} books in this genre`);
}
});
}
Template Usage
<!-- Genre selector dropdown -->
<select [(ngModel)]="selectedGenero">
<option [ngValue]="null">Seleccione un género</option>
<option *ngFor="let genero of generos" [ngValue]="genero">
{{ genero.nombre }}
</option>
</select>
<!-- Display book genre -->
<div *ngIf="libro" class="book-info">
<h2>{{ libro.titulo }}</h2>
<p class="genre-badge">{{ libro.genero.nombre }}</p>
</div>
<!-- Genre management list -->
<ul class="genre-list">
<li *ngFor="let genero of generos">
{{ genero.nombre }}
<button (click)="editGenero(genero)">Editar</button>
<button (click)="deleteGenero(genero.id)">Eliminar</button>
</li>
</ul>
Genre Statistics
getGenreStats() {
this.libroService.getAll().subscribe({
next: (libros: Libro[]) => {
const stats = new Map<string, number>();
libros.forEach(libro => {
const generoNombre = libro.genero.nombre;
stats.set(generoNombre, (stats.get(generoNombre) || 0) + 1);
});
stats.forEach((count, genero) => {
console.log(`${genero}: ${count} books`);
});
}
});
}
- Libro - Book interface that references Genero
Common Genres
Here are some common genre examples you might use:
- Ficción
- No Ficción
- Ciencia Ficción
- Fantasía
- Romance
- Misterio
- Thriller
- Historia
- Biografía
- Poesía
- Drama
- Terror
- Aventura
- Realismo Mágico
Notes
Deleting a genre that is associated with existing books may fail due to foreign key constraints. Ensure no books reference the genre before deletion.
Consider implementing a cascading update strategy so that when a genre is updated, all associated books reflect the change.
Genre names should be unique to avoid confusion. Consider adding validation on the backend to enforce this.