MagicVilla_VillaAPI/MagicVilla_VillaAPI.csproj
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RestorePackagesPath>..\packages</RestorePackagesPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="7.0.0-preview.5.22303.8" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="7.0.0-preview.5.22303.8" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.0-preview.5.22303.8" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.10">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.0-preview.5.22302.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.10">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="SQLite.CodeFirst" Version="1.7.0.34" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup>
</Project>
MagicVilla_VillaAPI/appsettings.json
{
"Logging" : {
"LogLevel" : {
"Default" : "Information" ,
"Microsoft.AspNetCore" : "Warning"
}
} ,
"AllowedHosts" : "*" ,
"ConnectionStrings" : {
"DefaultSQLConnection" : "Data Source=MagicVilla.db"
}
}
MagicVilla_VillaAPI/appsettings.Development.json
{
"Logging" : {
"LogLevel" : {
"Default" : "Information" ,
"Microsoft.AspNetCore" : "Warning"
}
}
}
MagicVilla_VillaAPI/Program.cs
using MagicVilla_VillaAPI.Data;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<ApplicationDbContext>(option =>
{
option.UseSqlite(builder.Configuration.GetConnectionString("DefaultSQLConnection" ));
});
builder.Services.AddControllers(option =>
{
}).AddNewtonsoftJson();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
MagicVilla_VillaAPI/Models/Villa.cs
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using SQLite.CodeFirst;
namespace MagicVilla_VillaAPI.Models
{
public class Villa
{
[Key ]
[DatabaseGenerated(DatabaseGeneratedOption.Identity) ]
public int Id { get ; set ; }
public string Name { get ; set ; }
public string Details { get ; set ; }
public double Rate { get ; set ; }
public int Sqft { get ; set ; }
public int Occupancy { get ; set ; }
public string ImageUrl { get ; set ; }
public string Amenity { get ; set ; }
public DateTime CreatedDate { get ; set ; }
public DateTime UpdatedDate { get ; set ; }
}
}
MagicVilla_VillaAPI/Models/Dto/VillaDTO.cs
using System.ComponentModel.DataAnnotations;
namespace MagicVilla_VillaAPI.Models.Dto
{
public class VillaDTO
{
public int Id { get ; set ; }
[Required ]
[MaxLength(30) ]
public string Name { get ; set ; }
public string Details { get ; set ; }
[Required ]
public double Rate { get ; set ; }
public int Occupancy { get ; set ; }
public int Sqft { get ; set ; }
public string ImageUrl { get ; set ; }
public string Amenity { get ; set ; }
}
}
MagicVilla_VillaAPI/Models/Dto/VillaCreateDTO.cs
using System.ComponentModel.DataAnnotations;
namespace MagicVilla_VillaAPI.Models.Dto
{
public class VillaCreateDTO
{
[Required ]
[MaxLength(30) ]
public string Name { get ; set ; }
public string Details { get ; set ; }
[Required ]
public double Rate { get ; set ; }
public int Occupancy { get ; set ; }
public int Sqft { get ; set ; }
public string ImageUrl { get ; set ; }
public string Amenity { get ; set ; }
}
}
MagicVilla_VillaAPI/Models/Dto/VillaUpdateDTO.cs
using System.ComponentModel.DataAnnotations;
namespace MagicVilla_VillaAPI.Models.Dto
{
public class VillaUpdateDTO
{
[Required ]
public int Id { get ; set ; }
[Required ]
[MaxLength(30) ]
public string Name { get ; set ; }
public string Details { get ; set ; }
[Required ]
public double Rate { get ; set ; }
[Required ]
public int Occupancy { get ; set ; }
[Required ]
public int Sqft { get ; set ; }
[Required ]
public string ImageUrl { get ; set ; }
public string Amenity { get ; set ; }
}
}
MagicVilla_VillaAPI/Controllers/VillaAPIController.cs
using MagicVilla_VillaAPI.Data;
using MagicVilla_VillaAPI.Models;
using MagicVilla_VillaAPI.Models.Dto;
using Microsoft.AspNetCore.JsonPatch;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace MagicVilla_VillaAPI.Controllers
{
[Route("api/VillaAPI" ) ]
[ApiController ]
public class VillaAPIController : ControllerBase
{
private readonly ApplicationDbContext _db;
public VillaAPIController (ApplicationDbContext db )
{
_db = db;
}
[HttpGet ]
[ProducesResponseType(StatusCodes.Status200OK) ]
public ActionResult<IEnumerable<VillaDTO>> GetVillas()
{
return Ok(_db.Villas.ToList());
}
[HttpGet("{id:int}" , Name = "GetVilla" ) ]
[ProducesResponseType(StatusCodes.Status200OK) ]
[ProducesResponseType(StatusCodes.Status400BadRequest) ]
[ProducesResponseType(StatusCodes.Status404NotFound) ]
public ActionResult<VillaDTO> GetVilla (int id )
{
if (id == 0 )
{
return BadRequest();
}
var villa = _db.Villas.FirstOrDefault(u => u.Id == id);
if (villa == null )
{
return NotFound();
}
return Ok(villa);
}
[HttpPost ]
[ProducesResponseType(StatusCodes.Status201Created) ]
[ProducesResponseType(StatusCodes.Status400BadRequest) ]
[ProducesResponseType(StatusCodes.Status500InternalServerError) ]
public ActionResult<VillaDTO> CreateVilla ([FromBody] VillaCreateDTO villaDTO )
{
if (_db.Villas.FirstOrDefault(u => u.Name.ToLower() == villaDTO.Name.ToLower()) != null )
{
ModelState.AddModelError("CustomError" , "Villa already Exists!" );
return BadRequest(ModelState);
}
if (villaDTO == null )
{
return BadRequest(villaDTO);
}
Villa model = new ()
{
Amenity = villaDTO.Amenity,
Details = villaDTO.Details,
ImageUrl = villaDTO.ImageUrl,
Name = villaDTO.Name,
Occupancy = villaDTO.Occupancy,
Rate = villaDTO.Rate,
Sqft = villaDTO.Sqft,
CreatedDate = DateTime.Now,
UpdatedDate = DateTime.Now
};
_db.Villas.Add(model);
_db.SaveChanges();
return CreatedAtRoute("GetVilla" , new { id = model.Id }, model);
}
[ProducesResponseType(StatusCodes.Status204NoContent) ]
[ProducesResponseType(StatusCodes.Status404NotFound) ]
[ProducesResponseType(StatusCodes.Status400BadRequest) ]
[HttpDelete("{id:int}" , Name = "DeleteVilla" ) ]
public IActionResult DeleteVilla (int id )
{
if (id == 0 )
{
return BadRequest();
}
var villa = _db.Villas.FirstOrDefault(u => u.Id == id);
if (villa == null )
{
return NotFound();
}
_db.Villas.Remove(villa);
_db.SaveChanges();
return NoContent();
}
[HttpPut("{id:int}" , Name = "UpdateVilla" ) ]
[ProducesResponseType(StatusCodes.Status204NoContent) ]
[ProducesResponseType(StatusCodes.Status400BadRequest) ]
public IActionResult UpdateVilla (int id, [FromBody] VillaUpdateDTO villaDTO )
{
if (villaDTO == null || id != villaDTO.Id)
{
return BadRequest();
}
Villa model = new ()
{
Amenity = villaDTO.Amenity,
Details = villaDTO.Details,
Id = villaDTO.Id,
ImageUrl = villaDTO.ImageUrl,
Name = villaDTO.Name,
Occupancy = villaDTO.Occupancy,
Rate = villaDTO.Rate,
Sqft = villaDTO.Sqft,
UpdatedDate = DateTime.Now
};
_db.Villas.Update(model);
_db.SaveChanges();
return NoContent();
}
[HttpPatch("{id:int}" , Name = "UpdatePartialVilla" ) ]
[ProducesResponseType(StatusCodes.Status204NoContent) ]
[ProducesResponseType(StatusCodes.Status400BadRequest) ]
public IActionResult UpdatePartialVilla (int id, JsonPatchDocument<VillaUpdateDTO> patchDTO )
{
if (patchDTO == null || id == 0 )
{
return BadRequest();
}
var villa = _db.Villas.AsNoTracking().FirstOrDefault(u => u.Id == id);
VillaUpdateDTO villaDTO = new ()
{
Amenity = villa.Amenity,
Details = villa.Details,
Id = villa.Id,
ImageUrl = villa.ImageUrl,
Name = villa.Name,
Occupancy = villa.Occupancy,
Rate = villa.Rate,
Sqft = villa.Sqft,
};
if (villa == null )
{
return BadRequest();
}
patchDTO.ApplyTo(villaDTO, ModelState);
Villa model = new ()
{
Amenity = villaDTO.Amenity,
Details = villaDTO.Details,
Id = villaDTO.Id,
ImageUrl = villaDTO.ImageUrl,
Name = villaDTO.Name,
Occupancy = villaDTO.Occupancy,
Rate = villaDTO.Rate,
Sqft = villaDTO.Sqft,
UpdatedDate = DateTime.Now
};
_db.Villas.Update(model);
_db.SaveChanges();
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
return NoContent();
}
}
}
MagicVilla_VillaAPI/Data/ApplicationDbContext.cs
using MagicVilla_VillaAPI.Models;
using Microsoft.EntityFrameworkCore;
namespace MagicVilla_VillaAPI.Data
{
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext (DbContextOptions<ApplicationDbContext> options )
: base (options )
{
}
public DbSet<Villa> Villas { get ; set ; }
protected override void OnModelCreating (ModelBuilder modelBuilder )
{
modelBuilder.Entity<Villa>()
.Property(v => v.UpdatedDate)
.HasDefaultValueSql("CURRENT_TIMESTAMP" );
modelBuilder.Entity<Villa>().HasData(
new Villa
{
Id = 1 ,
Name = "Royal Villa" ,
Details = "Fusce 11 tincidunt maximus leo, sed scelerisque massa auctor sit amet. Donec ex mauris, hendrerit quis nibh ac, efficitur fringilla enim." ,
ImageUrl = "https://dotnetmasteryimages.blob.core.windows.net/bluevillaimages/villa3.jpg" ,
Occupancy = 4 ,
Rate = 200 ,
Sqft = 550 ,
Amenity = "" ,
CreatedDate = DateTime.Now
},
new Villa
{
Id = 2 ,
Name = "Premium Pool Villa" ,
Details = "Fusce 11 tincidunt maximus leo, sed scelerisque massa auctor sit amet. Donec ex mauris, hendrerit quis nibh ac, efficitur fringilla enim." ,
ImageUrl = "https://dotnetmasteryimages.blob.core.windows.net/bluevillaimages/villa1.jpg" ,
Occupancy = 4 ,
Rate = 300 ,
Sqft = 550 ,
Amenity = "" ,
CreatedDate = DateTime.Now
},
new Villa
{
Id = 3 ,
Name = "Luxury Pool Villa" ,
Details = "Fusce 11 tincidunt maximus leo, sed scelerisque massa auctor sit amet. Donec ex mauris, hendrerit quis nibh ac, efficitur fringilla enim." ,
ImageUrl = "https://dotnetmasteryimages.blob.core.windows.net/bluevillaimages/villa4.jpg" ,
Occupancy = 4 ,
Rate = 400 ,
Sqft = 750 ,
Amenity = "" ,
CreatedDate = DateTime.Now
},
new Villa
{
Id = 4 ,
Name = "Diamond Villa" ,
Details = "Fusce 11 tincidunt maximus leo, sed scelerisque massa auctor sit amet. Donec ex mauris, hendrerit quis nibh ac, efficitur fringilla enim." ,
ImageUrl = "https://dotnetmasteryimages.blob.core.windows.net/bluevillaimages/villa5.jpg" ,
Occupancy = 4 ,
Rate = 550 ,
Sqft = 900 ,
Amenity = "" ,
CreatedDate = DateTime.Now
},
new Villa
{
Id = 5 ,
Name = "Diamond Pool Villa" ,
Details = "Fusce 11 tincidunt maximus leo, sed scelerisque massa auctor sit amet. Donec ex mauris, hendrerit quis nibh ac, efficitur fringilla enim." ,
ImageUrl = "https://dotnetmasteryimages.blob.core.windows.net/bluevillaimages/villa2.jpg" ,
Occupancy = 4 ,
Rate = 600 ,
Sqft = 1100 ,
Amenity = "" ,
CreatedDate = DateTime.Now
});
}
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
2017-09-03 独立按键