From cb60f3de3155f711303898f53226538a61daa5d2 Mon Sep 17 00:00:00 2001 From: Egamorf Date: Wed, 9 Apr 2025 01:59:28 +0200 Subject: [PATCH 1/6] Add db context --- src/GameIdeas/GameIdeas.Shared/Model/Game.cs | 21 ++++++++++++++++ .../GameIdeas.Shared/Model/GamePlatform.cs | 10 ++++++++ .../GameIdeas.Shared/Model/Platform.cs | 8 ++++++ .../Context/GameIdeasContext.cs | 25 +++++++++++++++++++ .../GameIdeas.WebAPI/GameIdeas.WebAPI.csproj | 5 +++- 5 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/GameIdeas/GameIdeas.Shared/Model/Game.cs create mode 100644 src/GameIdeas/GameIdeas.Shared/Model/GamePlatform.cs create mode 100644 src/GameIdeas/GameIdeas.Shared/Model/Platform.cs create mode 100644 src/GameIdeas/Server/GameIdeas.WebAPI/Context/GameIdeasContext.cs diff --git a/src/GameIdeas/GameIdeas.Shared/Model/Game.cs b/src/GameIdeas/GameIdeas.Shared/Model/Game.cs new file mode 100644 index 0000000..ca7d07a --- /dev/null +++ b/src/GameIdeas/GameIdeas.Shared/Model/Game.cs @@ -0,0 +1,21 @@ +namespace GameIdeas.Shared.Model; + +public partial class Game +{ + public Game() + { + GamePlatforms = new HashSet(); + } + + public int Id { get; set; } + public string Title { get; set; } = null!; + public DateTime? ReleaseDate { get; set; } + public DateTime CreationDate { get; set; } + public DateTime? ModificationDate { get; set; } + public double? StorageSpace { get; set; } + public string? Description { get; set; } + public int? Interest { get; set; } + + public virtual ICollection GamePlatforms { get; set; } +} + \ No newline at end of file diff --git a/src/GameIdeas/GameIdeas.Shared/Model/GamePlatform.cs b/src/GameIdeas/GameIdeas.Shared/Model/GamePlatform.cs new file mode 100644 index 0000000..b2eb056 --- /dev/null +++ b/src/GameIdeas/GameIdeas.Shared/Model/GamePlatform.cs @@ -0,0 +1,10 @@ +namespace GameIdeas.Shared.Model; + +public partial class GamePlatform +{ + public int GameId { get; set; } + public int PlatformId { get; set; } + + public virtual Game Game { get; set; } = null!; + public virtual Platform Platform { get; set; } = null!; +} diff --git a/src/GameIdeas/GameIdeas.Shared/Model/Platform.cs b/src/GameIdeas/GameIdeas.Shared/Model/Platform.cs new file mode 100644 index 0000000..067ed65 --- /dev/null +++ b/src/GameIdeas/GameIdeas.Shared/Model/Platform.cs @@ -0,0 +1,8 @@ +namespace GameIdeas.Shared.Model; + +public partial class Platform +{ + public int Id { get; set; } + public string Libelle { get; set; } = null!; + public string? Url { get; set; } +} diff --git a/src/GameIdeas/Server/GameIdeas.WebAPI/Context/GameIdeasContext.cs b/src/GameIdeas/Server/GameIdeas.WebAPI/Context/GameIdeasContext.cs new file mode 100644 index 0000000..d135ee6 --- /dev/null +++ b/src/GameIdeas/Server/GameIdeas.WebAPI/Context/GameIdeasContext.cs @@ -0,0 +1,25 @@ +using GameIdeas.Shared.Model; +using Microsoft.EntityFrameworkCore; + +namespace GameIdeas.WebAPI.Context; + +public class GameIdeasContext : DbContext +{ + public GameIdeasContext(DbContextOptions option) + : base(option) + { } + + public virtual DbSet Games { get; set; } = null!; + public virtual DbSet Platforms { get; set; } = null!; + public virtual DbSet GamePlatforms { get; set; } = null!; + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseNpgsql(@"Host=myserver;Username=mylogin;Password=mypass;Database=mydatabase"); + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + } +} diff --git a/src/GameIdeas/Server/GameIdeas.WebAPI/GameIdeas.WebAPI.csproj b/src/GameIdeas/Server/GameIdeas.WebAPI/GameIdeas.WebAPI.csproj index ef7a3c8..1988e33 100644 --- a/src/GameIdeas/Server/GameIdeas.WebAPI/GameIdeas.WebAPI.csproj +++ b/src/GameIdeas/Server/GameIdeas.WebAPI/GameIdeas.WebAPI.csproj @@ -1,4 +1,4 @@ - + net9.0 @@ -12,10 +12,13 @@ + + + -- 2.39.5 From 16580eaebe0aba8689c4d649e2ade784d65d2a57 Mon Sep 17 00:00:00 2001 From: Maxime Adler Date: Wed, 9 Apr 2025 15:10:49 +0200 Subject: [PATCH 2/6] Add db context to services --- .../Client/GameIdeas.BlazorApp/Program.cs | 23 ++++--- .../Context/GameIdeasContext.cs | 10 ++- .../Server/GameIdeas.WebAPI/Program.cs | 63 ++++++++++++------- 3 files changed, 63 insertions(+), 33 deletions(-) diff --git a/src/GameIdeas/Client/GameIdeas.BlazorApp/Program.cs b/src/GameIdeas/Client/GameIdeas.BlazorApp/Program.cs index 3331e0c..e35dffa 100644 --- a/src/GameIdeas/Client/GameIdeas.BlazorApp/Program.cs +++ b/src/GameIdeas/Client/GameIdeas.BlazorApp/Program.cs @@ -29,15 +29,20 @@ builder.Services.AddSingleton(); var app = builder.Build(); -var client = app.Services.GetService()?.CreateClient("GameIdeas.WebAPI") ?? - throw new Exception("Http client not found"); -var response = await client.GetAsync("api/Translations"); -var dictionary = await response.Content.ReadFromJsonAsync>(); +await FetchTranslation(app); -if (dictionary != null) +await app.RunAsync(); + +static async Task FetchTranslation(WebAssemblyHost app) { - app.Services.GetService()!.Initialize(dictionary); - ResourcesKey.Initialize(app.Services.GetService()!); -} + var client = app.Services.GetService()?.CreateClient("GameIdeas.WebAPI") ?? + throw new Exception("Http client not found"); + var response = await client.GetAsync("api/Translations"); + var dictionary = await response.Content.ReadFromJsonAsync>(); -await app.RunAsync(); \ No newline at end of file + if (dictionary != null) + { + app.Services.GetService()!.Initialize(dictionary); + ResourcesKey.Initialize(app.Services.GetService()!); + } +} \ No newline at end of file diff --git a/src/GameIdeas/Server/GameIdeas.WebAPI/Context/GameIdeasContext.cs b/src/GameIdeas/Server/GameIdeas.WebAPI/Context/GameIdeasContext.cs index d135ee6..0ac64be 100644 --- a/src/GameIdeas/Server/GameIdeas.WebAPI/Context/GameIdeasContext.cs +++ b/src/GameIdeas/Server/GameIdeas.WebAPI/Context/GameIdeasContext.cs @@ -5,9 +5,12 @@ namespace GameIdeas.WebAPI.Context; public class GameIdeasContext : DbContext { - public GameIdeasContext(DbContextOptions option) + private ILoggerFactory LoggerFactory; + public GameIdeasContext(DbContextOptions option, ILoggerFactory loggerFactory) : base(option) - { } + { + LoggerFactory = loggerFactory; + } public virtual DbSet Games { get; set; } = null!; public virtual DbSet Platforms { get; set; } = null!; @@ -15,7 +18,8 @@ public class GameIdeasContext : DbContext protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { - optionsBuilder.UseNpgsql(@"Host=myserver;Username=mylogin;Password=mypass;Database=mydatabase"); + optionsBuilder.UseLoggerFactory(LoggerFactory); + base.OnConfiguring(optionsBuilder); } protected override void OnModelCreating(ModelBuilder modelBuilder) diff --git a/src/GameIdeas/Server/GameIdeas.WebAPI/Program.cs b/src/GameIdeas/Server/GameIdeas.WebAPI/Program.cs index b5be7c3..bbb1ee9 100644 --- a/src/GameIdeas/Server/GameIdeas.WebAPI/Program.cs +++ b/src/GameIdeas/Server/GameIdeas.WebAPI/Program.cs @@ -1,47 +1,68 @@ using GameIdeas.Resources; -using System.Resources; +using GameIdeas.WebAPI.Context; +using Microsoft.EntityFrameworkCore; var builder = WebApplication.CreateBuilder(args); +var services = builder.Services; +var connectionString = @"Host=myserver;Username=mylogin;Password=mypass;Database=mydatabase"; + +Action> dbContextOptions = options => +{ + options.UseNpgsql( + connectionString, + npgOption => + { + npgOption.CommandTimeout(60); + npgOption.MigrationsAssembly("GameIdeas.WebAPI"); + }); +}; // Add services to the container. +services.AddDbContext(); -builder.Services.AddControllers(); +services.AddControllers(); // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi -builder.Services.AddOpenApi(); +services.AddOpenApi(); -builder.Services.AddCors(option => option.AddDefaultPolicy(policy => +services.AddCors(option => option.AddDefaultPolicy(policy => policy.WithOrigins("http://localhost:5172") .AllowAnyHeader() - .WithMethods("GET", "POST"))); + .WithMethods("GET", "POST", "PUT", "DELETE"))); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); +services.AddSingleton(); +services.AddSingleton(); var app = builder.Build(); +await LoadTranslations(); + // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.MapOpenApi(); } -var filesDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Files"); -var translationFiles = Directory.GetFiles(filesDirectory, "*.json"); -var dictionary = new Dictionary(); -foreach (var file in translationFiles) -{ - var name = file.Split('.'); - var culture = name[^2]; - var content = await File.ReadAllTextAsync(file); - dictionary.Add(culture, content); -} - -app.Services.GetRequiredService().Initialize(dictionary); -ResourcesKey.Initialize(app.Services.GetRequiredService()); - app.UseCors(); app.UseAuthorization(); app.MapControllers(); app.Run(); + +async Task LoadTranslations() +{ + var filesDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Files"); + var translationFiles = Directory.GetFiles(filesDirectory, "*.json"); + var dictionary = new Dictionary(); + foreach (var file in translationFiles) + { + var name = file.Split('.'); + var culture = name[^2]; + var content = await File.ReadAllTextAsync(file); + dictionary.Add(culture, content); + } + + app.Services.GetRequiredService().Initialize(dictionary); + ResourcesKey.Initialize(app.Services.GetRequiredService()); + +} -- 2.39.5 From e82e412c1893fa79bee6a4a3d81434615d23adf1 Mon Sep 17 00:00:00 2001 From: Egamorf Date: Wed, 9 Apr 2025 20:30:44 +0200 Subject: [PATCH 3/6] Add models --- .../GameIdeas.Shared/Model/Developer.cs | 14 ++++++++++++++ src/GameIdeas/GameIdeas.Shared/Model/Game.cs | 15 ++++++++++++++- .../GameIdeas.Shared/Model/GameDeveloper.cs | 10 ++++++++++ .../GameIdeas.Shared/Model/GameProperty.cs | 10 ++++++++++ .../GameIdeas.Shared/Model/GamePublisher.cs | 10 ++++++++++ .../GameIdeas.Shared/Model/GameTag.cs | 10 ++++++++++ .../GameIdeas.Shared/Model/Platform.cs | 8 ++++++++ .../GameIdeas.Shared/Model/Property.cs | 15 +++++++++++++++ .../GameIdeas.Shared/Model/Publisher.cs | 14 ++++++++++++++ src/GameIdeas/GameIdeas.Shared/Model/Tag.cs | 14 ++++++++++++++ src/GameIdeas/GameIdeas.Shared/Model/User.cs | 18 ++++++++++++++++++ 11 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 src/GameIdeas/GameIdeas.Shared/Model/Developer.cs create mode 100644 src/GameIdeas/GameIdeas.Shared/Model/GameDeveloper.cs create mode 100644 src/GameIdeas/GameIdeas.Shared/Model/GameProperty.cs create mode 100644 src/GameIdeas/GameIdeas.Shared/Model/GamePublisher.cs create mode 100644 src/GameIdeas/GameIdeas.Shared/Model/GameTag.cs create mode 100644 src/GameIdeas/GameIdeas.Shared/Model/Property.cs create mode 100644 src/GameIdeas/GameIdeas.Shared/Model/Publisher.cs create mode 100644 src/GameIdeas/GameIdeas.Shared/Model/Tag.cs create mode 100644 src/GameIdeas/GameIdeas.Shared/Model/User.cs diff --git a/src/GameIdeas/GameIdeas.Shared/Model/Developer.cs b/src/GameIdeas/GameIdeas.Shared/Model/Developer.cs new file mode 100644 index 0000000..97c7fdd --- /dev/null +++ b/src/GameIdeas/GameIdeas.Shared/Model/Developer.cs @@ -0,0 +1,14 @@ +namespace GameIdeas.Shared.Model; + +public partial class Developer +{ + public Developer() + { + GameDevelopers = new HashSet(); + } + + public int Id { get; set; } + public string Name { get; set; } = null!; + + public virtual ICollection GameDevelopers { get; set; } +} diff --git a/src/GameIdeas/GameIdeas.Shared/Model/Game.cs b/src/GameIdeas/GameIdeas.Shared/Model/Game.cs index ca7d07a..a3c1e9e 100644 --- a/src/GameIdeas/GameIdeas.Shared/Model/Game.cs +++ b/src/GameIdeas/GameIdeas.Shared/Model/Game.cs @@ -5,17 +5,30 @@ public partial class Game public Game() { GamePlatforms = new HashSet(); + GameProperties = new HashSet(); + GameTags = new HashSet(); + GamePublishers = new HashSet(); + GameDevelopers = new HashSet(); } public int Id { get; set; } public string Title { get; set; } = null!; public DateTime? ReleaseDate { get; set; } public DateTime CreationDate { get; set; } + public int CreationUserId { get; set; } public DateTime? ModificationDate { get; set; } + public int? ModificationUserId { get; set; } public double? StorageSpace { get; set; } public string? Description { get; set; } - public int? Interest { get; set; } + public int Interest { get; set; } + + public virtual User CreationUser { get; set; } = null!; + public virtual User? ModificationUser { get; set; } public virtual ICollection GamePlatforms { get; set; } + public virtual ICollection GameProperties { get; set; } + public virtual ICollection GameTags { get; set; } + public virtual ICollection GamePublishers { get; set; } + public virtual ICollection GameDevelopers { get; set; } } \ No newline at end of file diff --git a/src/GameIdeas/GameIdeas.Shared/Model/GameDeveloper.cs b/src/GameIdeas/GameIdeas.Shared/Model/GameDeveloper.cs new file mode 100644 index 0000000..a4d4c56 --- /dev/null +++ b/src/GameIdeas/GameIdeas.Shared/Model/GameDeveloper.cs @@ -0,0 +1,10 @@ +namespace GameIdeas.Shared.Model; + +public partial class GameDeveloper +{ + public int GameId { get; set; } + public int DeveloperId { get; set; } + + public virtual Game Game { get; set; } = null!; + public virtual Developer Developer { get; set; } = null!; +} diff --git a/src/GameIdeas/GameIdeas.Shared/Model/GameProperty.cs b/src/GameIdeas/GameIdeas.Shared/Model/GameProperty.cs new file mode 100644 index 0000000..6843cfa --- /dev/null +++ b/src/GameIdeas/GameIdeas.Shared/Model/GameProperty.cs @@ -0,0 +1,10 @@ +namespace GameIdeas.Shared.Model; + +public partial class GameProperty +{ + public int GameId { get; set; } + public int PropertyId { get; set; } + + public virtual Game Game { get; set; } = null!; + public virtual Property Property { get; set; } = null!; +} diff --git a/src/GameIdeas/GameIdeas.Shared/Model/GamePublisher.cs b/src/GameIdeas/GameIdeas.Shared/Model/GamePublisher.cs new file mode 100644 index 0000000..fa255fd --- /dev/null +++ b/src/GameIdeas/GameIdeas.Shared/Model/GamePublisher.cs @@ -0,0 +1,10 @@ +namespace GameIdeas.Shared.Model; + +public partial class GamePublisher +{ + public int GameId { get; set; } + public int PublisherId { get; set; } + + public virtual Game Game { get; set; } = null!; + public virtual Publisher Publisher { get; set; } = null!; +} diff --git a/src/GameIdeas/GameIdeas.Shared/Model/GameTag.cs b/src/GameIdeas/GameIdeas.Shared/Model/GameTag.cs new file mode 100644 index 0000000..002b3f7 --- /dev/null +++ b/src/GameIdeas/GameIdeas.Shared/Model/GameTag.cs @@ -0,0 +1,10 @@ +namespace GameIdeas.Shared.Model; + +public partial class GameTag +{ + public int GameId { get; set; } + public int TagId { get; set; } + + public virtual Game Game { get; set; } = null!; + public virtual Tag Tag { get; set; } = null!; +} diff --git a/src/GameIdeas/GameIdeas.Shared/Model/Platform.cs b/src/GameIdeas/GameIdeas.Shared/Model/Platform.cs index 067ed65..af045aa 100644 --- a/src/GameIdeas/GameIdeas.Shared/Model/Platform.cs +++ b/src/GameIdeas/GameIdeas.Shared/Model/Platform.cs @@ -2,7 +2,15 @@ public partial class Platform { + public Platform() + { + GamePlatforms = new HashSet(); + } + public int Id { get; set; } public string Libelle { get; set; } = null!; public string? Url { get; set; } + + public virtual ICollection GamePlatforms { get; set; } + } diff --git a/src/GameIdeas/GameIdeas.Shared/Model/Property.cs b/src/GameIdeas/GameIdeas.Shared/Model/Property.cs new file mode 100644 index 0000000..7ceebb1 --- /dev/null +++ b/src/GameIdeas/GameIdeas.Shared/Model/Property.cs @@ -0,0 +1,15 @@ +namespace GameIdeas.Shared.Model; + +public partial class Property +{ + public Property() + { + GameProperties = new HashSet(); + } + + public int Id { get; set; } + public string Label { get; set; } = null!; + + public virtual ICollection GameProperties { get; set; } + +} diff --git a/src/GameIdeas/GameIdeas.Shared/Model/Publisher.cs b/src/GameIdeas/GameIdeas.Shared/Model/Publisher.cs new file mode 100644 index 0000000..1bf0c9c --- /dev/null +++ b/src/GameIdeas/GameIdeas.Shared/Model/Publisher.cs @@ -0,0 +1,14 @@ +namespace GameIdeas.Shared.Model; + +public partial class Publisher +{ + public Publisher() + { + GamePublishers = new HashSet(); + } + + public int Id { get; set; } + public string Name { get; set; } = null!; + + public virtual ICollection GamePublishers { get; set; } +} diff --git a/src/GameIdeas/GameIdeas.Shared/Model/Tag.cs b/src/GameIdeas/GameIdeas.Shared/Model/Tag.cs new file mode 100644 index 0000000..5db523f --- /dev/null +++ b/src/GameIdeas/GameIdeas.Shared/Model/Tag.cs @@ -0,0 +1,14 @@ +namespace GameIdeas.Shared.Model; + +public partial class Tag +{ + public Tag() + { + GameTags = new HashSet(); + } + + public int Id { get; set; } + public string Label { get; set; } = null!; + + public virtual ICollection GameTags { get; set; } +} diff --git a/src/GameIdeas/GameIdeas.Shared/Model/User.cs b/src/GameIdeas/GameIdeas.Shared/Model/User.cs new file mode 100644 index 0000000..22d2678 --- /dev/null +++ b/src/GameIdeas/GameIdeas.Shared/Model/User.cs @@ -0,0 +1,18 @@ +namespace GameIdeas.Shared.Model; + +public partial class User +{ + public User() + { + CreationGames = new HashSet(); + ModificationGames = new HashSet(); + } + + public Guid Id { get; set; } + public string Username { get; set; } = null!; + public string Password { get; set; } = null!; + public int Role { get; set; } + + public virtual ICollection CreationGames { get; set; } + public virtual ICollection ModificationGames { get; set; } +} -- 2.39.5 From 749146c8c40cf54e78677af5c58eac58edd06971 Mon Sep 17 00:00:00 2001 From: Egamorf Date: Wed, 9 Apr 2025 21:39:05 +0200 Subject: [PATCH 4/6] complet model builder --- src/GameIdeas/GameIdeas.Shared/Model/Game.cs | 2 +- src/GameIdeas/GameIdeas.Shared/Model/User.cs | 2 +- .../Context/GameIdeasContext.cs | 141 +++++++++++++++++- .../Server/GameIdeas.WebAPI/Program.cs | 1 + 4 files changed, 143 insertions(+), 3 deletions(-) diff --git a/src/GameIdeas/GameIdeas.Shared/Model/Game.cs b/src/GameIdeas/GameIdeas.Shared/Model/Game.cs index a3c1e9e..038b580 100644 --- a/src/GameIdeas/GameIdeas.Shared/Model/Game.cs +++ b/src/GameIdeas/GameIdeas.Shared/Model/Game.cs @@ -11,7 +11,7 @@ public partial class Game GameDevelopers = new HashSet(); } - public int Id { get; set; } + public Guid Id { get; set; } public string Title { get; set; } = null!; public DateTime? ReleaseDate { get; set; } public DateTime CreationDate { get; set; } diff --git a/src/GameIdeas/GameIdeas.Shared/Model/User.cs b/src/GameIdeas/GameIdeas.Shared/Model/User.cs index 22d2678..29f2a95 100644 --- a/src/GameIdeas/GameIdeas.Shared/Model/User.cs +++ b/src/GameIdeas/GameIdeas.Shared/Model/User.cs @@ -8,7 +8,7 @@ public partial class User ModificationGames = new HashSet(); } - public Guid Id { get; set; } + public int Id { get; set; } public string Username { get; set; } = null!; public string Password { get; set; } = null!; public int Role { get; set; } diff --git a/src/GameIdeas/Server/GameIdeas.WebAPI/Context/GameIdeasContext.cs b/src/GameIdeas/Server/GameIdeas.WebAPI/Context/GameIdeasContext.cs index 0ac64be..ad2976f 100644 --- a/src/GameIdeas/Server/GameIdeas.WebAPI/Context/GameIdeasContext.cs +++ b/src/GameIdeas/Server/GameIdeas.WebAPI/Context/GameIdeasContext.cs @@ -6,15 +6,25 @@ namespace GameIdeas.WebAPI.Context; public class GameIdeasContext : DbContext { private ILoggerFactory LoggerFactory; + public GameIdeasContext(DbContextOptions option, ILoggerFactory loggerFactory) : base(option) { LoggerFactory = loggerFactory; } - public virtual DbSet Games { get; set; } = null!; + public virtual DbSet Users { get; set; } = null!; + public virtual DbSet Developers { get; set; } = null!; public virtual DbSet Platforms { get; set; } = null!; + public virtual DbSet Properties { get; set; } = null!; + public virtual DbSet Publishers { get; set; } = null!; + public virtual DbSet Tags { get; set; } = null!; + public virtual DbSet Games { get; set; } = null!; + public virtual DbSet GameDevelopers { get; set; } = null!; public virtual DbSet GamePlatforms { get; set; } = null!; + public virtual DbSet GameProperties { get; set; } = null!; + public virtual DbSet GamePublishers { get; set; } = null!; + public virtual DbSet GameTags { get; set; } = null!; protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { @@ -24,6 +34,135 @@ public class GameIdeasContext : DbContext protected override void OnModelCreating(ModelBuilder modelBuilder) { + modelBuilder.Entity(entity => { + entity.ToTable("User"); + + entity.Property(e => e.Id) + .UseIdentityByDefaultColumn() + .HasIdentityOptions(startValue: 100000); + }); + + modelBuilder.Entity(entity => entity.ToTable("Developer")); + + modelBuilder.Entity(entity => entity.ToTable("Platform")); + + modelBuilder.Entity(entity => entity.ToTable("Property")); + + modelBuilder.Entity(entity => entity.ToTable("Publisher")); + + modelBuilder.Entity(entity => entity.ToTable("Tag")); + + modelBuilder.Entity(entity => + { + entity.ToTable("Game"); + + entity.HasIndex(e => e.CreationUserId); + + entity.HasIndex(e => e.ModificationUserId); + + entity.Property(e => e.CreationDate) + .HasDefaultValueSql("now()"); + + entity.Property(e => e.Id) + .UseIdentityByDefaultColumn() + .HasIdentityOptions(startValue: 100000); + + entity.HasOne(d => d.CreationUser) + .WithMany(p => p.CreationGames) + .HasForeignKey(d => d.CreationUserId) + .OnDelete(DeleteBehavior.ClientSetNull); + + entity.HasOne(d => d.ModificationUser) + .WithMany(p => p.ModificationGames) + .HasForeignKey(d => d.ModificationUserId) + .OnDelete(DeleteBehavior.ClientSetNull); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("GameDeveloper"); + + entity.HasKey(e => new { e.GameId, e.DeveloperId }); + + entity.HasOne(d => d.Game) + .WithMany(p => p.GameDevelopers) + .HasForeignKey(d => d.GameId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Developer) + .WithMany(p => p.GameDevelopers) + .HasForeignKey(d => d.DeveloperId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("GamePlatform"); + + entity.HasKey(e => new { e.GameId, e.PlatformId }); + + entity.HasOne(d => d.Game) + .WithMany(p => p.GamePlatforms) + .HasForeignKey(d => d.GameId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Platform) + .WithMany(p => p.GamePlatforms) + .HasForeignKey(d => d.PlatformId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("GameProperty"); + + entity.HasKey(e => new { e.GameId, e.PropertyId }); + + entity.HasOne(d => d.Game) + .WithMany(p => p.GameProperties) + .HasForeignKey(d => d.GameId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Property) + .WithMany(p => p.GameProperties) + .HasForeignKey(d => d.PropertyId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("GamePublisher"); + + entity.HasKey(e => new { e.GameId, e.PublisherId }); + + entity.HasOne(d => d.Game) + .WithMany(p => p.GamePublishers) + .HasForeignKey(d => d.GameId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Publisher) + .WithMany(p => p.GamePublishers) + .HasForeignKey(d => d.PublisherId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("GameTag"); + + entity.HasKey(e => new { e.GameId, e.TagId }); + + entity.HasOne(d => d.Game) + .WithMany(p => p.GameTags) + .HasForeignKey(d => d.GameId) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Tag) + .WithMany(p => p.GameTags) + .HasForeignKey(d => d.TagId) + .OnDelete(DeleteBehavior.Cascade); + }); + base.OnModelCreating(modelBuilder); } } diff --git a/src/GameIdeas/Server/GameIdeas.WebAPI/Program.cs b/src/GameIdeas/Server/GameIdeas.WebAPI/Program.cs index bbb1ee9..108fffa 100644 --- a/src/GameIdeas/Server/GameIdeas.WebAPI/Program.cs +++ b/src/GameIdeas/Server/GameIdeas.WebAPI/Program.cs @@ -15,6 +15,7 @@ Action> dbContextOptions = options => npgOption.CommandTimeout(60); npgOption.MigrationsAssembly("GameIdeas.WebAPI"); }); + }; // Add services to the container. -- 2.39.5 From 6627dc93be42671914a2936573ec459fae15fd53 Mon Sep 17 00:00:00 2001 From: Egamorf Date: Wed, 9 Apr 2025 21:43:06 +0200 Subject: [PATCH 5/6] move platform url --- src/GameIdeas/GameIdeas.Shared/Model/GamePlatform.cs | 1 + src/GameIdeas/GameIdeas.Shared/Model/Platform.cs | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GameIdeas/GameIdeas.Shared/Model/GamePlatform.cs b/src/GameIdeas/GameIdeas.Shared/Model/GamePlatform.cs index b2eb056..cbf4609 100644 --- a/src/GameIdeas/GameIdeas.Shared/Model/GamePlatform.cs +++ b/src/GameIdeas/GameIdeas.Shared/Model/GamePlatform.cs @@ -4,6 +4,7 @@ public partial class GamePlatform { public int GameId { get; set; } public int PlatformId { get; set; } + public string? Url { get; set; } public virtual Game Game { get; set; } = null!; public virtual Platform Platform { get; set; } = null!; diff --git a/src/GameIdeas/GameIdeas.Shared/Model/Platform.cs b/src/GameIdeas/GameIdeas.Shared/Model/Platform.cs index af045aa..a4c643c 100644 --- a/src/GameIdeas/GameIdeas.Shared/Model/Platform.cs +++ b/src/GameIdeas/GameIdeas.Shared/Model/Platform.cs @@ -9,7 +9,6 @@ public partial class Platform public int Id { get; set; } public string Libelle { get; set; } = null!; - public string? Url { get; set; } public virtual ICollection GamePlatforms { get; set; } -- 2.39.5 From 086b68c539c37eb21230e5e772e56170b089493d Mon Sep 17 00:00:00 2001 From: Egamorf Date: Wed, 9 Apr 2025 23:10:03 +0200 Subject: [PATCH 6/6] Add first miggration --- .gitea/workflows/build-pr.yaml | 4 +- .gitignore | 4 +- README.md | 11 +- src/GameIdeas/GameIdeas.Shared/Model/Game.cs | 2 +- .../Context/GameIdeasContext.cs | 14 +- .../GameIdeas.WebAPI/GameIdeas.WebAPI.csproj | 4 + .../20250409210640_InitialCreate.Designer.cs | 422 ++++++++++++++++++ .../20250409210640_InitialCreate.cs | 325 ++++++++++++++ .../GameIdeasContextModelSnapshot.cs | 419 +++++++++++++++++ .../Server/GameIdeas.WebAPI/Program.cs | 57 ++- 10 files changed, 1234 insertions(+), 28 deletions(-) create mode 100644 src/GameIdeas/Server/GameIdeas.WebAPI/Migrations/20250409210640_InitialCreate.Designer.cs create mode 100644 src/GameIdeas/Server/GameIdeas.WebAPI/Migrations/20250409210640_InitialCreate.cs create mode 100644 src/GameIdeas/Server/GameIdeas.WebAPI/Migrations/GameIdeasContextModelSnapshot.cs diff --git a/.gitea/workflows/build-pr.yaml b/.gitea/workflows/build-pr.yaml index 8699650..abfb2f3 100644 --- a/.gitea/workflows/build-pr.yaml +++ b/.gitea/workflows/build-pr.yaml @@ -1,7 +1,7 @@ name: Game Ideas build for PR on: pull_request: - types: [ opened, edited, closed, reopened, synchronize ] + types: [ opened, edited, reopened, synchronize ] branches: - 'feature/**' - main @@ -22,4 +22,4 @@ jobs: run: dotnet build ./src/GameIdeas/Client/GameIdeas.BlazorApp/GameIdeas.BlazorApp.csproj - name: Build API App - run: dotnet build ./src/GameIdeas/Server/GameIdeas.WebAPI/GameIdeas.WebAPI.csproj \ No newline at end of file + run: dotnet build ./src/GameIdeas/Server/GameIdeas.WebAPI/GameIdeas.WebAPI.csproj \ No newline at end of file diff --git a/.gitignore b/.gitignore index 2e36d2a..54842ee 100644 --- a/.gitignore +++ b/.gitignore @@ -436,4 +436,6 @@ FodyWeavers.xsd .history .ionide -# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode \ No newline at end of file +# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode + +.env \ No newline at end of file diff --git a/README.md b/README.md index cee14ad..9170bd2 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Store your favorite games, intelligent game add, store game files and data, mana ## Services -| project | Port | Technos | Base de données | +| Project | Port | Technos | Base de données | | ------------- | --------- | --------------- | --------------- | | WebApp | 5172,7060 | C# (Blazor) | | | API | 8000 | C# (ASP.NET) | PostgreSQL | @@ -29,6 +29,15 @@ Store your favorite games, intelligent game add, store game files and data, mana └── GameIdeas.Shared ``` +## Environment variables + +| Name | Value type | +| --- | --- | +| DB_HOST | Address IP or hostname of the database | +| DB_USERNAME | Username for the database | +| DB_PASSWORD | Plain password for the database | +| DB_DATABASE | Name of the database | +