new migration
This commit is contained in:
10
ApiEfCoreLibrary/DTO/Login/Request/UpdateLoginDto.cs
Normal file
10
ApiEfCoreLibrary/DTO/Login/Request/UpdateLoginDto.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
namespace ApiEfCoreLibrary.DTO.Login.Request;
|
||||||
|
|
||||||
|
public class UpdateLoginDto
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
public string? Username { get; set; }
|
||||||
|
public string? FullName { get; set; }
|
||||||
|
public string? Password { get; set; }
|
||||||
|
public string? Salt { get; set; }
|
||||||
|
}
|
37
ApiEfCoreLibrary/Endpoints/Login/CreateLoginEndpoint.cs
Normal file
37
ApiEfCoreLibrary/Endpoints/Login/CreateLoginEndpoint.cs
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
using ApiEfCoreLibrary.DTO.Author.Request;
|
||||||
|
using ApiEfCoreLibrary.DTO.Author.Response;
|
||||||
|
|
||||||
|
namespace ApiEfCoreLibrary.Endpoints.Author;
|
||||||
|
using FastEndpoints;
|
||||||
|
|
||||||
|
public class CreateLoginEndpoint(LibraryDbContext database) : Endpoint<CreateAuthorDto, GetAuthorDto>
|
||||||
|
{
|
||||||
|
public override void Configure()
|
||||||
|
{
|
||||||
|
Post("/api/authors");
|
||||||
|
AllowAnonymous();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task HandleAsync(CreateAuthorDto req, CancellationToken ct)
|
||||||
|
{
|
||||||
|
var author = new Models.Author()
|
||||||
|
{
|
||||||
|
Name = req.Name,
|
||||||
|
FirstName = req.FirstName
|
||||||
|
};
|
||||||
|
|
||||||
|
database.Authors.Add(author);
|
||||||
|
|
||||||
|
await database.SaveChangesAsync(ct);
|
||||||
|
// Pour renvoyer une erreur : Send.StringAsync("Le message d'erreur", 400);
|
||||||
|
|
||||||
|
GetAuthorDto responseDto = new()
|
||||||
|
{
|
||||||
|
Id = author.Id,
|
||||||
|
Name = author.Name,
|
||||||
|
FirstName = author.FirstName
|
||||||
|
};
|
||||||
|
|
||||||
|
await Send.OkAsync(responseDto, ct);
|
||||||
|
}
|
||||||
|
}
|
36
ApiEfCoreLibrary/Endpoints/Login/DeleteLoginEndpoint.cs
Normal file
36
ApiEfCoreLibrary/Endpoints/Login/DeleteLoginEndpoint.cs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
using ApiEfCoreLibrary.DTO.Author.Request;
|
||||||
|
using ApiEfCoreLibrary.DTO.Author.Response;
|
||||||
|
using FastEndpoints;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace ApiEfCoreLibrary.Endpoints.Author;
|
||||||
|
|
||||||
|
public class DeleteAuthorRequest
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class DeleteLoginEndpoint(LibraryDbContext database) : Endpoint<DeleteAuthorRequest>
|
||||||
|
{
|
||||||
|
public override void Configure()
|
||||||
|
{
|
||||||
|
Delete("/api/authors/{@Id}", x => new {x.Id});
|
||||||
|
AllowAnonymous();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task HandleAsync(DeleteAuthorRequest req, CancellationToken ct)
|
||||||
|
{
|
||||||
|
var author = await database.Authors.SingleOrDefaultAsync(x => x.Id == req.Id, ct);
|
||||||
|
|
||||||
|
if (author == null)
|
||||||
|
{
|
||||||
|
await Send.NotFoundAsync(ct);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
database.Authors.Remove(author);
|
||||||
|
await database.SaveChangesAsync(ct);
|
||||||
|
|
||||||
|
await Send.NoContentAsync(ct);
|
||||||
|
}
|
||||||
|
}
|
40
ApiEfCoreLibrary/Endpoints/Login/GetAllLoginEndpoint.cs
Normal file
40
ApiEfCoreLibrary/Endpoints/Login/GetAllLoginEndpoint.cs
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
using ApiEfCoreLibrary.DTO.Author.Response;
|
||||||
|
using ApiEfCoreLibrary.DTO.Book.Response;
|
||||||
|
using FastEndpoints;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace ApiEfCoreLibrary.Endpoints.Author;
|
||||||
|
|
||||||
|
public class GetAllLoginEndpoint(LibraryDbContext database) : EndpointWithoutRequest<List<GetAuthorDto>>
|
||||||
|
{
|
||||||
|
public override void Configure()
|
||||||
|
{
|
||||||
|
Get("/api/authors");
|
||||||
|
AllowAnonymous();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task HandleAsync(CancellationToken ct)
|
||||||
|
{
|
||||||
|
var authors = await database.Authors
|
||||||
|
.Include(x => x.Books)
|
||||||
|
.Select(author => new GetAuthorDto()
|
||||||
|
{
|
||||||
|
Id = author.Id,
|
||||||
|
Name = author.Name,
|
||||||
|
FirstName = author.FirstName,
|
||||||
|
Books = author.Books.Select(book => new GetBookDto
|
||||||
|
{
|
||||||
|
Id = book.Id,
|
||||||
|
Title = book.Title,
|
||||||
|
AuthorId = book.AuthorId,
|
||||||
|
BookAuthorName = book.Author.Name,
|
||||||
|
BookAuthorFirstName = book.Author.FirstName,
|
||||||
|
ReleaseYear = book.ReleaseYear,
|
||||||
|
Isbn = book.Isbn
|
||||||
|
}).ToList()
|
||||||
|
})
|
||||||
|
.ToListAsync(ct);
|
||||||
|
|
||||||
|
await Send.OkAsync(authors, ct);
|
||||||
|
}
|
||||||
|
}
|
53
ApiEfCoreLibrary/Endpoints/Login/GetLoginEndpoint.cs
Normal file
53
ApiEfCoreLibrary/Endpoints/Login/GetLoginEndpoint.cs
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
using ApiEfCoreLibrary.DTO.Author.Request;
|
||||||
|
using ApiEfCoreLibrary.DTO.Author.Response;
|
||||||
|
using ApiEfCoreLibrary.DTO.Book.Response;
|
||||||
|
using FastEndpoints;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace ApiEfCoreLibrary.Endpoints.Author;
|
||||||
|
|
||||||
|
public class GetAuthorRequest
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class GetLoginEndpoint(LibraryDbContext database) : Endpoint<GetAuthorRequest, GetAuthorDto>
|
||||||
|
{
|
||||||
|
public override void Configure()
|
||||||
|
{
|
||||||
|
Get("/api/authors/{@Id}", x => new {x.Id});
|
||||||
|
AllowAnonymous();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task HandleAsync(GetAuthorRequest req, CancellationToken ct)
|
||||||
|
{
|
||||||
|
var author = await database.Authors
|
||||||
|
.Include(x => x.Books)
|
||||||
|
.SingleOrDefaultAsync(x => x.Id == req.Id, ct);
|
||||||
|
|
||||||
|
if (author == null)
|
||||||
|
{
|
||||||
|
await Send.NotFoundAsync(ct);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
GetAuthorDto responseDto = new()
|
||||||
|
{
|
||||||
|
Id = author.Id,
|
||||||
|
Name = author.Name,
|
||||||
|
FirstName = author.FirstName,
|
||||||
|
Books = author.Books.Select(book => new GetBookDto
|
||||||
|
{
|
||||||
|
Id = book.Id,
|
||||||
|
Title = book.Title,
|
||||||
|
AuthorId = book.AuthorId,
|
||||||
|
BookAuthorName = book.Author.Name,
|
||||||
|
BookAuthorFirstName = book.Author.FirstName,
|
||||||
|
ReleaseYear = book.ReleaseYear,
|
||||||
|
Isbn = book.Isbn
|
||||||
|
}).ToList()
|
||||||
|
};
|
||||||
|
|
||||||
|
await Send.OkAsync(responseDto, ct);
|
||||||
|
}
|
||||||
|
}
|
40
ApiEfCoreLibrary/Endpoints/Login/UpdateLoginEndpoint.cs
Normal file
40
ApiEfCoreLibrary/Endpoints/Login/UpdateLoginEndpoint.cs
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
using ApiEfCoreLibrary.DTO.Author.Request;
|
||||||
|
using ApiEfCoreLibrary.DTO.Author.Response;
|
||||||
|
using ApiEfCoreLibrary.DTO.Book.Response;
|
||||||
|
using FastEndpoints;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace ApiEfCoreLibrary.Endpoints.Author;
|
||||||
|
|
||||||
|
public class UpdateLoginEndpoint(LibraryDbContext database) : Endpoint<UpdateAuthorDto, GetAuthorDto>
|
||||||
|
{
|
||||||
|
public override void Configure()
|
||||||
|
{
|
||||||
|
Put("/api/authors/{@Id}", x => new {x.Id});
|
||||||
|
AllowAnonymous();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task HandleAsync(UpdateAuthorDto req, CancellationToken ct)
|
||||||
|
{
|
||||||
|
var author = await database.Authors.SingleOrDefaultAsync(x => x.Id == req.Id, ct);
|
||||||
|
|
||||||
|
if (author == null)
|
||||||
|
{
|
||||||
|
await Send.NotFoundAsync(ct);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
author.Name = req.Name;
|
||||||
|
author.FirstName = req.FirstName;
|
||||||
|
await database.SaveChangesAsync(ct);
|
||||||
|
|
||||||
|
GetAuthorDto responseDto = new()
|
||||||
|
{
|
||||||
|
Id = author.Id,
|
||||||
|
Name = author.Name,
|
||||||
|
FirstName = author.FirstName,
|
||||||
|
};
|
||||||
|
|
||||||
|
await Send.OkAsync(responseDto, ct);
|
||||||
|
}
|
||||||
|
}
|
220
ApiEfCoreLibrary/Migrations/20251013121137_EditingDatabase.Designer.cs
generated
Normal file
220
ApiEfCoreLibrary/Migrations/20251013121137_EditingDatabase.Designer.cs
generated
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
// <auto-generated />
|
||||||
|
using System;
|
||||||
|
using ApiEfCoreLibrary;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using Microsoft.EntityFrameworkCore.Metadata;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace ApiEfCoreLibrary.Migrations
|
||||||
|
{
|
||||||
|
[DbContext(typeof(LibraryDbContext))]
|
||||||
|
[Migration("20251013121137_EditingDatabase")]
|
||||||
|
partial class EditingDatabase
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
#pragma warning disable 612, 618
|
||||||
|
modelBuilder
|
||||||
|
.HasAnnotation("ProductVersion", "8.0.20")
|
||||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 128);
|
||||||
|
|
||||||
|
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
|
||||||
|
|
||||||
|
modelBuilder.Entity("ApiEfCoreLibrary.Models.Author", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<string>("FirstName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(100)
|
||||||
|
.HasColumnType("nvarchar(100)");
|
||||||
|
|
||||||
|
b.Property<string>("Name")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(100)
|
||||||
|
.HasColumnType("nvarchar(100)");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.ToTable("Authors");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("ApiEfCoreLibrary.Models.Book", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<int>("AuthorId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<string>("Isbn")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(20)
|
||||||
|
.HasColumnType("nvarchar(20)");
|
||||||
|
|
||||||
|
b.Property<int?>("ReleaseYear")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<string>("Title")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(255)
|
||||||
|
.HasColumnType("nvarchar(255)");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("AuthorId");
|
||||||
|
|
||||||
|
b.ToTable("Books");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("ApiEfCoreLibrary.Models.Loan", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<int>("BookId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<DateOnly>("Date")
|
||||||
|
.HasColumnType("date");
|
||||||
|
|
||||||
|
b.Property<DateOnly?>("EffectiveReturningDate")
|
||||||
|
.HasColumnType("date");
|
||||||
|
|
||||||
|
b.Property<DateOnly>("PlannedReturningDate")
|
||||||
|
.HasColumnType("date");
|
||||||
|
|
||||||
|
b.Property<int>("UserId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("BookId");
|
||||||
|
|
||||||
|
b.HasIndex("UserId");
|
||||||
|
|
||||||
|
b.ToTable("Loans");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("ApiEfCoreLibrary.Models.Login", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<string>("FullName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(200)
|
||||||
|
.HasColumnType("nvarchar(200)");
|
||||||
|
|
||||||
|
b.Property<string>("Password")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(255)
|
||||||
|
.HasColumnType("nvarchar(255)");
|
||||||
|
|
||||||
|
b.Property<string>("Salt")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(24)
|
||||||
|
.HasColumnType("nvarchar(24)");
|
||||||
|
|
||||||
|
b.Property<string>("Username")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(100)
|
||||||
|
.HasColumnType("nvarchar(100)");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.ToTable("Logins");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("ApiEfCoreLibrary.Models.User", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<DateOnly?>("BirthDate")
|
||||||
|
.HasColumnType("date");
|
||||||
|
|
||||||
|
b.Property<string>("Email")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(255)
|
||||||
|
.HasColumnType("nvarchar(255)");
|
||||||
|
|
||||||
|
b.Property<string>("FirstName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(100)
|
||||||
|
.HasColumnType("nvarchar(100)");
|
||||||
|
|
||||||
|
b.Property<string>("Name")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(100)
|
||||||
|
.HasColumnType("nvarchar(100)");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.ToTable("Users");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("ApiEfCoreLibrary.Models.Book", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("ApiEfCoreLibrary.Models.Author", "Author")
|
||||||
|
.WithMany("Books")
|
||||||
|
.HasForeignKey("AuthorId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Author");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("ApiEfCoreLibrary.Models.Loan", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("ApiEfCoreLibrary.Models.Book", "Book")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("BookId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.HasOne("ApiEfCoreLibrary.Models.User", "User")
|
||||||
|
.WithMany("Loans")
|
||||||
|
.HasForeignKey("UserId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Book");
|
||||||
|
|
||||||
|
b.Navigation("User");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("ApiEfCoreLibrary.Models.Author", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Books");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("ApiEfCoreLibrary.Models.User", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Loans");
|
||||||
|
});
|
||||||
|
#pragma warning restore 612, 618
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,22 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace ApiEfCoreLibrary.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class EditingDatabase : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -6,6 +6,6 @@ public class Login
|
|||||||
[Key] public int Id { get; set; }
|
[Key] public int Id { get; set; }
|
||||||
[Required, MaxLength(100)] public string? Username { get; set; }
|
[Required, MaxLength(100)] public string? Username { get; set; }
|
||||||
[Required, MaxLength(200)] public string? FullName { get; set; }
|
[Required, MaxLength(200)] public string? FullName { get; set; }
|
||||||
[Required, MaxLength(255)] public string? Password { get; set; }
|
[Required, Length(60, 60)] public string? Password { get; set; }
|
||||||
[Required, MinLength(24), MaxLength(24)] public string? Salt { get; set; }
|
[Required, Length(24, 24)] public string? Salt { get; set; }
|
||||||
}
|
}
|
Reference in New Issue
Block a user