Добавил все круд операции для пользователя

parent 10764f24
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Payment.WebApi.Enums;
using Payment.WebApi.Models.DbModels; using Payment.WebApi.Models.DbModels;
using Payment.WebApi.Models.RequestModels;
using Payment.WebApi.Repositories.Interfaces; using Payment.WebApi.Repositories.Interfaces;
namespace Payment.WebApi.Controllers; namespace Payment.WebApi.Controllers;
...@@ -16,7 +18,7 @@ public class UserController : Controller ...@@ -16,7 +18,7 @@ public class UserController : Controller
} }
[HttpGet] [HttpGet]
[ActionName("GetUser")] [ActionName("GetById")]
public ActionResult<User> GetUser(int id) public ActionResult<User> GetUser(int id)
{ {
try try
...@@ -32,4 +34,87 @@ public class UserController : Controller ...@@ -32,4 +34,87 @@ public class UserController : Controller
return StatusCode(500, new { errorMessage = e.Message }); return StatusCode(500, new { errorMessage = e.Message });
} }
} }
[HttpPost]
[ActionName("Create")]
public ActionResult<DefaultResponse> Create(UserRequestModel requestModel)
{
try
{
_userRepository.Create(new User
{
FirstName = requestModel.FirstName,
LastName = requestModel.LastName,
MiddleName = requestModel.MiddleName,
Age = requestModel.Age,
Email = requestModel.Email,
IsActive = true
});
_userRepository.Save();
return Ok(new DefaultResponse
{
ResponseStatusType = ResponseStatusType.Ok
});
}
catch (Exception e)
{
return StatusCode(500, new { errorMessage = e.Message });
}
}
[HttpPut]
[ActionName("Edit")]
public ActionResult<DefaultResponse> Edit(UserRequestModel requestModel)
{
try
{
var user = _userRepository.GetFirstOrDefaultByEmail(requestModel.Email);
if (user is null)
return Ok(new DefaultResponse
{
ResponseStatusType = ResponseStatusType.NotFound
});
_userRepository.Update(UpdateUser(user, requestModel));
_userRepository.Save();
return Ok(new DefaultResponse
{
ResponseStatusType = ResponseStatusType.Ok
});
}
catch (Exception e)
{
return StatusCode(500, new { errorMessage = e.Message });
}
}
[HttpDelete]
[ActionName("Delete")]
public ActionResult<DefaultResponse> Delete(int id)
{
var user = _userRepository.GetFirstOrDefaultById(id);
if (user is null)
return Ok(new DefaultResponse
{
ResponseStatusType = ResponseStatusType.NotFound
});
user.IsActive = false;
_userRepository.Save();
return Ok(new DefaultResponse
{
ResponseStatusType = ResponseStatusType.Ok
});
}
private static User UpdateUser(User user, UserRequestModel requestModel)
{
user.FirstName = requestModel.FirstName;
user.LastName = requestModel.LastName;
user.MiddleName = requestModel.MiddleName;
user.Age = user.Age;
return user;
}
} }
\ No newline at end of file
namespace Payment.WebApi.Enums;
public enum ResponseStatusType
{
Undefined = 0,
Ok = 1,
NotFound = 2
}
\ No newline at end of file
...@@ -14,7 +14,9 @@ public static class DataSeeder ...@@ -14,7 +14,9 @@ public static class DataSeeder
Age = 25, Age = 25,
FirstName = "Jhon", FirstName = "Jhon",
LastName = "Doe", LastName = "Doe",
MiddleName = "Blastovich" MiddleName = "Blastovich",
Email = "userOne@test",
IsActive = true
}); });
builder.Entity<User>() builder.Entity<User>()
...@@ -24,7 +26,9 @@ public static class DataSeeder ...@@ -24,7 +26,9 @@ public static class DataSeeder
Age = 27, Age = 27,
FirstName = "Jhoan", FirstName = "Jhoan",
LastName = "Shepard", LastName = "Shepard",
MiddleName = default MiddleName = default,
Email = "userOne@test",
IsActive = true
}); });
} }
......
// <auto-generated />
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using Payment.WebApi.Infrastructures.Databases;
#nullable disable
namespace Payment.WebApi.Migrations
{
[DbContext(typeof(PaymentDbContext))]
[Migration("20220706141914_Initial")]
partial class Initial
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "6.0.6")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("Payment.WebApi.Models.DbModels.Supplier", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Suppliers");
b.HasData(
new
{
Id = 1,
Name = "Алсеко"
},
new
{
Id = 2,
Name = "Казактелеком"
},
new
{
Id = 3,
Name = "Beeline"
});
});
modelBuilder.Entity("Payment.WebApi.Models.DbModels.User", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Age")
.HasColumnType("integer");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("MiddleName")
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Users");
b.HasData(
new
{
Id = 1,
Age = 25,
FirstName = "Jhon",
LastName = "Doe",
MiddleName = "Blastovich"
},
new
{
Id = 2,
Age = 27,
FirstName = "Jhoan",
LastName = "Shepard"
});
});
modelBuilder.Entity("Payment.WebApi.Models.DbModels.UserBalance", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<decimal>("Amount")
.HasColumnType("numeric");
b.Property<string>("Currency")
.IsRequired()
.HasColumnType("text");
b.Property<int>("UserId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("UserBalance");
b.HasData(
new
{
Id = 1,
Amount = 100m,
Currency = "KZT",
UserId = 1
},
new
{
Id = 2,
Amount = 250m,
Currency = "KZT",
UserId = 2
});
});
modelBuilder.Entity("Payment.WebApi.Models.DbModels.UserBalance", b =>
{
b.HasOne("Payment.WebApi.Models.DbModels.User", "User")
.WithMany("Balances")
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("Payment.WebApi.Models.DbModels.User", b =>
{
b.Navigation("Balances");
});
#pragma warning restore 612, 618
}
}
}
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace Payment.WebApi.Migrations
{
public partial class Initial : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Suppliers",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Name = table.Column<string>(type: "text", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Suppliers", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Users",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
FirstName = table.Column<string>(type: "text", nullable: false),
LastName = table.Column<string>(type: "text", nullable: false),
MiddleName = table.Column<string>(type: "text", nullable: true),
Age = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Users", x => x.Id);
});
migrationBuilder.CreateTable(
name: "UserBalance",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Amount = table.Column<decimal>(type: "numeric", nullable: false),
Currency = table.Column<string>(type: "text", nullable: false),
UserId = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_UserBalance", x => x.Id);
table.ForeignKey(
name: "FK_UserBalance_Users_UserId",
column: x => x.UserId,
principalTable: "Users",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.InsertData(
table: "Suppliers",
columns: new[] { "Id", "Name" },
values: new object[,]
{
{ 1, "Алсеко" },
{ 2, "Казактелеком" },
{ 3, "Beeline" }
});
migrationBuilder.InsertData(
table: "Users",
columns: new[] { "Id", "Age", "FirstName", "LastName", "MiddleName" },
values: new object[,]
{
{ 1, 25, "Jhon", "Doe", "Blastovich" },
{ 2, 27, "Jhoan", "Shepard", null }
});
migrationBuilder.InsertData(
table: "UserBalance",
columns: new[] { "Id", "Amount", "Currency", "UserId" },
values: new object[,]
{
{ 1, 100m, "KZT", 1 },
{ 2, 250m, "KZT", 2 }
});
migrationBuilder.CreateIndex(
name: "IX_UserBalance_UserId",
table: "UserBalance",
column: "UserId");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Suppliers");
migrationBuilder.DropTable(
name: "UserBalance");
migrationBuilder.DropTable(
name: "Users");
}
}
}
// <auto-generated />
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using Payment.WebApi.Infrastructures.Databases;
#nullable disable
namespace Payment.WebApi.Migrations
{
[DbContext(typeof(PaymentDbContext))]
partial class PaymentDbContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "6.0.6")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("Payment.WebApi.Models.DbModels.Supplier", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Suppliers");
b.HasData(
new
{
Id = 1,
Name = "Алсеко"
},
new
{
Id = 2,
Name = "Казактелеком"
},
new
{
Id = 3,
Name = "Beeline"
});
});
modelBuilder.Entity("Payment.WebApi.Models.DbModels.User", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Age")
.HasColumnType("integer");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("MiddleName")
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Users");
b.HasData(
new
{
Id = 1,
Age = 25,
FirstName = "Jhon",
LastName = "Doe",
MiddleName = "Blastovich"
},
new
{
Id = 2,
Age = 27,
FirstName = "Jhoan",
LastName = "Shepard"
});
});
modelBuilder.Entity("Payment.WebApi.Models.DbModels.UserBalance", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<decimal>("Amount")
.HasColumnType("numeric");
b.Property<string>("Currency")
.IsRequired()
.HasColumnType("text");
b.Property<int>("UserId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("UserBalance");
b.HasData(
new
{
Id = 1,
Amount = 100m,
Currency = "KZT",
UserId = 1
},
new
{
Id = 2,
Amount = 250m,
Currency = "KZT",
UserId = 2
});
});
modelBuilder.Entity("Payment.WebApi.Models.DbModels.UserBalance", b =>
{
b.HasOne("Payment.WebApi.Models.DbModels.User", "User")
.WithMany("Balances")
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("Payment.WebApi.Models.DbModels.User", b =>
{
b.Navigation("Balances");
});
#pragma warning restore 612, 618
}
}
}
...@@ -4,10 +4,12 @@ public class User ...@@ -4,10 +4,12 @@ public class User
{ {
public int Id { get; set; } public int Id { get; set; }
public string FirstName { get; set; } public string FirstName { get; set; }
public string LastName { get; set; } public string? LastName { get; set; }
public string? MiddleName { get; set; } public string? MiddleName { get; set; }
public string Email { get; set; }
public int Age { get; set; } public int Age { get; set; }
public List<UserBalance> Balances { get; set; } public List<UserBalance> Balances { get; set; }
public bool IsActive { get; set; }
public User() public User()
{ {
......
using Payment.WebApi.Enums;
namespace Payment.WebApi.Models.RequestModels;
public class DefaultResponse
{
public ResponseStatusType ResponseStatusType { get; set; }
}
\ No newline at end of file
namespace Payment.WebApi.Models.RequestModels;
public class UserRequestModel
{
public string FirstName { get; set; }
public string? LastName { get; set; }
public string? MiddleName { get; set; }
public string Email { get; set; }
public int Age { get; set; }
}
\ No newline at end of file
...@@ -15,4 +15,8 @@ ...@@ -15,4 +15,8 @@
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Migrations" />
</ItemGroup>
</Project> </Project>
...@@ -5,4 +5,5 @@ namespace Payment.WebApi.Repositories.Interfaces; ...@@ -5,4 +5,5 @@ namespace Payment.WebApi.Repositories.Interfaces;
public interface IUserRepository : IRepository<User> public interface IUserRepository : IRepository<User>
{ {
User? GetFirstOrDefaultById(int id); User? GetFirstOrDefaultById(int id);
User? GetFirstOrDefaultByEmail(string email);
} }
\ No newline at end of file
...@@ -11,7 +11,10 @@ public class UserRepository : IUserRepository ...@@ -11,7 +11,10 @@ public class UserRepository : IUserRepository
public UserRepository(PaymentDbContext context) => public UserRepository(PaymentDbContext context) =>
_context = context ?? throw new ArgumentNullException(nameof(context)); _context = context ?? throw new ArgumentNullException(nameof(context));
public User? GetFirstOrDefaultById(int id) => _context.Users.FirstOrDefault(s => s.Id == id); public User? GetFirstOrDefaultById(int id) => _context.Users.FirstOrDefault(s => s.Id == id && s.IsActive);
public User? GetFirstOrDefaultByEmail(string email)
=> _context.Users.FirstOrDefault(s => string.Equals(s.Email, email, StringComparison.CurrentCultureIgnoreCase)
&& s.IsActive);
public void Create(User item) => _context.Users.Add(item); public void Create(User item) => _context.Users.Add(item);
public void Update(User item) => _context.Users.Update(item); public void Update(User item) => _context.Users.Update(item);
public void Remove(User item) => _context.Users.Remove(item); public void Remove(User item) => _context.Users.Remove(item);
......
...@@ -10,4 +10,3 @@ ...@@ -10,4 +10,3 @@
"ConnectionString" : "Server=localhost;Port=5432;Database=Payments;UserId=postgres" "ConnectionString" : "Server=localhost;Port=5432;Database=Payments;UserId=postgres"
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment