Добавьте файлы проекта.
This commit is contained in:
14
ContactsApp.csproj
Normal file
14
ContactsApp.csproj
Normal file
@@ -0,0 +1,14 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.0" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.0.1" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
6
ContactsApp.http
Normal file
6
ContactsApp.http
Normal file
@@ -0,0 +1,6 @@
|
||||
@ContactsApp_HostAddress = http://localhost:5246
|
||||
|
||||
GET {{ContactsApp_HostAddress}}/weatherforecast/
|
||||
Accept: application/json
|
||||
|
||||
###
|
||||
3
ContactsApp.slnx
Normal file
3
ContactsApp.slnx
Normal file
@@ -0,0 +1,3 @@
|
||||
<Solution>
|
||||
<Project Path="ContactsApp.csproj" />
|
||||
</Solution>
|
||||
90
Controllers/ContactController.cs
Normal file
90
Controllers/ContactController.cs
Normal file
@@ -0,0 +1,90 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Diagnostics.HealthChecks;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace ContactsApp
|
||||
{
|
||||
[ApiController]
|
||||
[Route("api/contacts")]
|
||||
public class ContactController(IContactRepository repository) : ControllerBase
|
||||
{
|
||||
[HttpGet]
|
||||
public ActionResult<IEnumerable<Contact>> GetAll()
|
||||
{
|
||||
var contacts = repository.GetAll().ToList();
|
||||
return Ok(contacts);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public ActionResult<Contact> Create([FromBody] Contact contact)
|
||||
{
|
||||
repository.AddContact(contact);
|
||||
return Ok(contact);
|
||||
}
|
||||
|
||||
[HttpGet("{id:Guid}")]
|
||||
public ActionResult<Contact> GetById(Guid id)
|
||||
{
|
||||
var contact = repository.GetContactById(id);
|
||||
if (contact == null)
|
||||
return NotFound();
|
||||
|
||||
return Ok(contact);
|
||||
}
|
||||
[HttpPost("{id:Guid}")]
|
||||
public ActionResult Update(Guid id, [FromBody] Contact contact)
|
||||
{
|
||||
repository.UpdateContact(id, contact);
|
||||
return Ok();
|
||||
}
|
||||
|
||||
[HttpDelete("{id:Guid}")]
|
||||
public ActionResult Delete(Guid id)
|
||||
{
|
||||
var contact = repository.GetContactById(id);
|
||||
if (contact == null)
|
||||
return NotFound();
|
||||
|
||||
repository.DeleteContact(id);
|
||||
return Ok();
|
||||
}
|
||||
|
||||
[HttpPost("upload")]
|
||||
public async Task<IActionResult> Upload(IFormFile file)
|
||||
{
|
||||
if (file == null || file.Length == 0)
|
||||
return BadRequest("<22><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.");
|
||||
|
||||
using var stream = new MemoryStream();
|
||||
await file.CopyToAsync(stream);
|
||||
string json = System.Text.Encoding.UTF8.GetString(stream.ToArray());
|
||||
|
||||
try
|
||||
{
|
||||
repository.LoadJSON(json); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> JSON <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return BadRequest("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> JSON: " + ex.Message);
|
||||
}
|
||||
|
||||
return Ok("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.");
|
||||
}
|
||||
|
||||
[HttpGet("download")]
|
||||
public IActionResult Download()
|
||||
{
|
||||
string json = repository.SaveJSON(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> JSON <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(json);
|
||||
|
||||
return File(
|
||||
bytes,
|
||||
"application/json",
|
||||
"contacts.json"
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
16
IContactRepository.cs
Normal file
16
IContactRepository.cs
Normal file
@@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ContactsApp
|
||||
{
|
||||
public interface IContactRepository
|
||||
{
|
||||
public void AddContact(Contact contact);
|
||||
public void UpdateContact(Guid id, Contact contact);
|
||||
public void DeleteContact(Guid id);
|
||||
public Contact GetContactById(Guid id);
|
||||
public IEnumerable<Contact> GetAll();
|
||||
public void LoadJSON(string file);
|
||||
public string SaveJSON();
|
||||
}
|
||||
}
|
||||
33
Models/Contact.cs
Normal file
33
Models/Contact.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Net.Mail;
|
||||
|
||||
namespace ContactsApp
|
||||
{
|
||||
public class Contact
|
||||
{
|
||||
public Guid Id { get; }
|
||||
public string Name { get; set; }
|
||||
public string? Email { get; set; }
|
||||
public string Phone { get; set; }
|
||||
|
||||
public Contact(string name, string? email, string phone)
|
||||
{
|
||||
Id = Guid.NewGuid();
|
||||
Name = name;
|
||||
|
||||
try
|
||||
{
|
||||
var addr = new MailAddress(email);
|
||||
Email = email;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception("Invalid email");
|
||||
}
|
||||
|
||||
Phone = phone;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
32
Program.cs
Normal file
32
Program.cs
Normal file
@@ -0,0 +1,32 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Swashbuckle.AspNetCore.Swagger;
|
||||
|
||||
|
||||
namespace ContactsApp;
|
||||
|
||||
public class Program
|
||||
{
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
// Add services to the container.
|
||||
builder.Services.AddControllers();
|
||||
builder.Services.AddAuthorization();
|
||||
builder.Services.AddSwaggerGen();
|
||||
|
||||
builder.Services.AddSingleton<IContactRepository, ContactRepository>();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// Configure the HTTP request pipeline.
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -> <20><><EFBFBD><EFBFBD><EFBFBD> -> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> -> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -> Kestrel -> (HttpContext) Middlewares -> Controller (mapping) -> AfterMethod -> Method -> BeforeMethod
|
||||
app.UseAuthorization();
|
||||
app.UseSwagger();
|
||||
app.UseSwaggerUI();
|
||||
|
||||
|
||||
app.MapControllers();
|
||||
app.Run();
|
||||
}
|
||||
}
|
||||
15
Properties/launchSettings.json
Normal file
15
Properties/launchSettings.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"$schema": "http://json.schemastore.org/launchsettings.json",
|
||||
"profiles": {
|
||||
"http": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": false,
|
||||
"launchUrl": "swagger",
|
||||
"applicationUrl": "http://localhost:5043",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
64
Repositories/ContactRepository.cs
Normal file
64
Repositories/ContactRepository.cs
Normal file
@@ -0,0 +1,64 @@
|
||||
using Microsoft.Win32;
|
||||
using System;
|
||||
using System.Runtime;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace ContactsApp
|
||||
{
|
||||
public class ContactRepository : IContactRepository
|
||||
{
|
||||
List<Contact> Contacts = new ();
|
||||
|
||||
|
||||
public void AddContact(Contact contact)
|
||||
{
|
||||
CheckUnique(contact);
|
||||
Contacts.Add(contact);
|
||||
}
|
||||
|
||||
public void UpdateContact(Guid id, Contact contact)
|
||||
{
|
||||
CheckUnique(contact);
|
||||
Contact previous = GetContactById(id);
|
||||
if (previous == null)
|
||||
{
|
||||
Contacts.Add(contact);
|
||||
return;
|
||||
}
|
||||
|
||||
previous.Name = contact.Name;
|
||||
previous.Email = contact.Email;
|
||||
previous.Phone = contact.Phone;
|
||||
}
|
||||
|
||||
public void DeleteContact(Guid id)
|
||||
{
|
||||
var contact = GetContactById(id);
|
||||
if (contact == null)
|
||||
return;
|
||||
Contacts.Remove(contact);
|
||||
}
|
||||
|
||||
public Contact GetContactById(Guid id)
|
||||
{
|
||||
return Contacts.Find(x => x.Id == id);
|
||||
}
|
||||
public void LoadJSON(string json)
|
||||
{
|
||||
var list = JsonSerializer.Deserialize<List<Contact>>(json);
|
||||
Contacts.AddRange(list);
|
||||
}
|
||||
public string SaveJSON()
|
||||
{
|
||||
return JsonSerializer.Serialize(Contacts, new JsonSerializerOptions { WriteIndented = true });
|
||||
}
|
||||
|
||||
public IEnumerable<Contact> GetAll() => Contacts;
|
||||
private void CheckUnique(Contact contact)
|
||||
{
|
||||
if (Contacts.FirstOrDefault(x => x.Equals(contact)) != null)
|
||||
throw new Exception("Такой контакт уже есть");
|
||||
}
|
||||
}
|
||||
}
|
||||
8
appsettings.Development.json
Normal file
8
appsettings.Development.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
9
appsettings.json
Normal file
9
appsettings.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
Reference in New Issue
Block a user