Files
TetaRdPG/src/material/character-material.entity.ts
Tetardtek 6df11f2860
All checks were successful
CI/CD — Build & Deploy / Build & Deploy (push) Successful in 35s
feat(sprint5): audit fixes — transactions, indexes, stat distribution, rest, forge cost
P0 — Race conditions fixées avec pessimistic_write transactions :
  combat (double-spend endurance), forge (double upgrade),
  craft (consumeMaterials atomique), equip (item swap).
Forge : coût or (50-1000) + endurance (15) ajouté.
Combat : item stat bonuses (force/agilite/intelligence/chance) appliqués.

P1 — Features manquantes :
  POST /api/characters/stats — distribution stat points (avec lock).
  POST /api/characters/rest — repos auberge (+50% HP, -20 endurance).
  Vitalité : +10 HP max par point distribué.

P2 — Indexes DB ajoutés :
  character_id sur character_items, character_materials, combat_logs,
  craft_jobs, player_achievements, community_contributions.
  Composite (characterId, materialId) sur character_materials.
  period sur hall_of_fame. achievement_id sur player_achievements.

P3 — Cleanup : @nestjs/jwt et pg retirés de package.json.
2026-03-24 15:55:50 +01:00

36 lines
755 B
TypeScript

import {
Entity,
PrimaryGeneratedColumn,
Column,
ManyToOne,
JoinColumn,
Index,
} from 'typeorm';
import { Character } from '../character/entities/character.entity';
import { Material } from './material.entity';
@Entity('character_materials')
@Index(['characterId', 'materialId'])
export class CharacterMaterial {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({ name: 'character_id' })
@Index()
characterId: string;
@ManyToOne(() => Character)
@JoinColumn({ name: 'character_id' })
character: Character;
@Column({ name: 'material_id' })
materialId: string;
@ManyToOne(() => Material, { eager: true })
@JoinColumn({ name: 'material_id' })
material: Material;
@Column({ default: 0 })
quantity: number;
}