Skip to main content

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

id
number
required
Unique identifier for the genre. Auto-generated by the backend.
nombre
string
required
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.

Build docs developers (and LLMs) love