diff --git a/Controllers/ItemController.cs b/Controllers/ItemController.cs index cef6f42..5d20ea7 100644 --- a/Controllers/ItemController.cs +++ b/Controllers/ItemController.cs @@ -8,17 +8,17 @@ using Microsoft.Data.Sqlite; namespace BuecherwurmAPI.Controllers { - [Route("inventar")] + [Route("api/inventar")] [ApiController] public class ItemController : ControllerBase { - private readonly IItemRepo _repository; + private readonly ItemModel _repository; - public ItemController(IItemRepo repository) + public ItemController(IItem repository) { - _repository = repository; + _repository = (ItemModel)repository; } - // GET Inventar + // GET api/inventar [HttpGet] public ActionResult> GetAllItems() { @@ -30,42 +30,31 @@ namespace BuecherwurmAPI.Controllers return NoContent(); } - // POST Inventar + // POST api/inventar [HttpPost] + public ActionResult> NewItem(ItemPost item) { - try - { - var newItem = _repository.NewItem(item); - if (item != null) - { - return Ok(newItem); - } - return NotFound(); - } - catch (System.Exception) - { - return StatusCode(304); //not Modified - } - + var newItem = _repository.NewItem(item); + return Ok(newItem); + } - - - // GET Inventar/{id} + + // GET api/nventar/{id} [HttpGet("{itemId}")] - public ActionResult> GetItemByID(long id) + public ActionResult> GetItemByID(long itemId) { - var item = _repository.GetItemById(id); + var item = _repository.GetItemById(itemId); if (item != null) { return Ok(item); } - return NoContent(); + return NotFound(); } - // DELETE inventory/{id} + // DELETE api/inventar/{id} - [HttpDelete("itemId")] + [HttpDelete("{itemId}")] public ActionResult> DeleteItem(long itemId) { var item = _repository.GetItemById(itemId); diff --git a/Controllers/KatalogController.cs b/Controllers/KatalogController.cs index 6bb34e4..0e4a68d 100644 --- a/Controllers/KatalogController.cs +++ b/Controllers/KatalogController.cs @@ -6,15 +6,15 @@ using System.Linq; namespace BuecherwurmAPI.Controllers { - [Route("katalog") ] + [Route("api/katalog") ] [ApiController] public class KatalogController :ControllerBase { - private readonly IBookRepo _repository; + private readonly KatalogModel _repository; - public KatalogController (IBookRepo repository) + public KatalogController (ICatalogue repository) { - _repository=repository; + _repository= (KatalogModel)repository; } // GET Katalog [HttpGet] @@ -26,9 +26,9 @@ namespace BuecherwurmAPI.Controllers // POST Katalog [HttpPost] - public ActionResult> NeuesBuch(Book book) + public ActionResult AddBook(BookPost book) { - + var id = _repository.AddBook(book); return Ok(new Book { Name = book.Name, @@ -38,7 +38,7 @@ namespace BuecherwurmAPI.Controllers Language= book.Language, Pages= book.Pages, Year=book.Year, - ProductId =book.ProductId, + ProductId = id, Category= book.Category, ImageLink =book.ImageLink, LendTime =book.LendTime, @@ -48,8 +48,8 @@ namespace BuecherwurmAPI.Controllers // GET katalog/{id} - [HttpGet("{id}", Name ="GetBookByID")] - public ActionResult > GetBookByID(int id) + [HttpGet("{id}")] + public ActionResult GetBookByID(long id) { var book = _repository.GetBookById(id); if (book != null) @@ -61,36 +61,23 @@ namespace BuecherwurmAPI.Controllers } // PUT Katalog/{id} - [HttpPut("id")] - public ActionResult> BuchBearbeiten(Book book) + [HttpPut("{id}")] + public ActionResult EditBook(long id, Book book) { - return Ok(new Book - { - Name = book.Name, - Author= book.Author, - Country= book.Country, - Link= book.Link, - Language= book.Language, - Pages= book.Pages, - Year=book.Year, - ProductId =book.ProductId, - Category= book.Category, - ImageLink =book.ImageLink, - LendTime =book.LendTime, - LendType = book.LendType - }); + _repository.EditBook(id, book); + return Ok(book); } // DELETE katalog/{id} - [HttpDelete("id")] - public ActionResult> BuchEntfernen (int id) + [HttpDelete("{id}")] + public ActionResult DeleteBook (long id) { var book = _repository.GetBookById(id); if(book == null) { return NotFound(); } - _repository.BuchEntfernen(book); + _repository.DeleteBook(id); return NoContent(); } diff --git a/Controllers/LendController.cs b/Controllers/LendController.cs index 813d893..f599103 100644 --- a/Controllers/LendController.cs +++ b/Controllers/LendController.cs @@ -4,11 +4,10 @@ using System.Linq; using System.Threading.Tasks; using AutoMapper; using BuecherwurmAPI.Models; -using BuecherwurmAPI.DTOs; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.JsonPatch; using Microsoft.Extensions.Logging; - +using Microsoft.Data.Sqlite; namespace BuecherwurmAPI.Controllers { @@ -16,13 +15,13 @@ namespace BuecherwurmAPI.Controllers [ApiController] public class LendController : ControllerBase { - private readonly IRepository _repository; - private readonly IMapper _mapper; + private readonly LendModel _repository; + //private readonly IMapper _mapper; - public LendController(IRepository repository, IMapper mapper) + public LendController(ILend repo) { - _repository = repository; - _mapper = mapper; + _repository = (LendModel)repo; + //_mapper = mapper; } //GET api/leihvorgang @@ -34,30 +33,25 @@ namespace BuecherwurmAPI.Controllers //POST api/leihvorgang [HttpPost] - public ActionResult LendsPost(Lend lend) + public ActionResult LendsPost(LendPost lend) { - /* - Internally a lend is stored with an id - but the client shouldn't be allowed to set or change it - therefore the package 'AutoMapper' is used to prevent errors - that could happen when doing this task manually. - It takes the information from the client and maps it to the - corresponding internal object which then will be returned. - Furthermore it could be used to keep some attributes secret. - Another nice effect of this is that the implementation could be changed - while the interface could be retained by some minor changes in the code. - - DTO stands for Data Transfer Object - */ - var item = new Lend + var newId = _repository.insertLendReturningId(lend); + if (newId > 0) { - Id = 256, - Customer = lend.Customer, - Returned = lend.Returned, - ItemId = lend.ItemId, - ReturnDate = lend.ReturnDate - }; - return Ok(item); + var item = new Lend + { + Id = newId, + Customer = lend.Customer, + Returned = false, + ItemId = lend.ItemId, + ReturnDate = lend.ReturnDate + }; + return Ok(item); + } + else + { + return BadRequest(); + } //return Ok(_mapper.Map(item)); } diff --git a/DTOs/ItemRead.cs b/DTOs/ItemRead.cs deleted file mode 100644 index e70a016..0000000 --- a/DTOs/ItemRead.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace BuecherwurmAPI.DTOs -{ - public class ItemReadDTO - { - public int BookId { get; set;} - } -} \ No newline at end of file diff --git a/DTOs/LendRead.cs b/DTOs/LendRead.cs deleted file mode 100644 index 5813213..0000000 --- a/DTOs/LendRead.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace BuecherwurmAPI.DTOs -{ - public class LendReadDTO - { - public int ItemId { get; set;} - public DateTime ReturnDate { get; set; } - public string Customer { get; set; } - public bool Returned { get; set; } - } -} \ No newline at end of file diff --git a/LongWormMemory.db b/LongWormMemory.db index 4b1deb5..2af348a 100644 Binary files a/LongWormMemory.db and b/LongWormMemory.db differ diff --git a/Models/Book.cs b/Models/Book.cs index 5304bdc..3e605de 100644 --- a/Models/Book.cs +++ b/Models/Book.cs @@ -9,14 +9,28 @@ namespace BuecherwurmAPI.Models public string Country {get; set;} public string Link {get; set;} public string Language {get; set;} - public int Pages {get; set;} - public int Year {get; set;} - [Key] - [Required] - public int ProductId { get; set; } + public long Pages {get; set;} + public long Year {get; set;} + [Key, Required] + public long ProductId { get; set; } public CategoryEnum Category { get; set; } public string ImageLink { get; set; } - public int LendTime {get; set;} + public long LendTime {get; set;} + public LendTypeEnum LendType {get; set;} + } + + public class BookPost + { + public string Name {get; set;} + public string Author {get; set;} + public string Country {get; set;} + public string Link {get; set;} + public string Language {get; set;} + public long Pages {get; set;} + public long Year {get; set;} + public CategoryEnum Category { get; set; } + public string ImageLink { get; set; } + public long LendTime {get; set;} public LendTypeEnum LendType {get; set;} } diff --git a/Models/IBookRepo.cs b/Models/IBookRepo.cs index 30fea50..2bf60e9 100644 --- a/Models/IBookRepo.cs +++ b/Models/IBookRepo.cs @@ -6,7 +6,9 @@ namespace BuecherwurmAPI.Models public interface IBookRepo { IEnumerable GetAllBooks(); - Book GetBookById(int id); - void BuchEntfernen(Book book); + Book GetBookById(long id); + void DeleteBook(long id); + long AddBook (Book book); + long EditBook (long id, Book book); } } \ No newline at end of file diff --git a/Models/ILendRepo.cs b/Models/ILendRepo.cs deleted file mode 100644 index 9e12f99..0000000 --- a/Models/ILendRepo.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; -using BuecherwurmAPI.Models; - -namespace BuecherwurmAPI.Models -{ - public interface ILendRepo - { - IEnumerable GetAllLends(); - Lend GetLendById(int id); - } -} \ No newline at end of file diff --git a/Models/IRepository.cs b/Models/IRepository.cs deleted file mode 100644 index 6e79a2a..0000000 --- a/Models/IRepository.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Collections.Generic; -using BuecherwurmAPI.Models; -using Microsoft.EntityFrameworkCore.Metadata.Conventions; - -namespace BuecherwurmAPI.Models -{ - public interface IRepository - { - IEnumerable GetAllLends(); - Lend GetLendById(long id); - bool IdExits(string table, long id); - } -} \ No newline at end of file diff --git a/Models/Item.cs b/Models/Item.cs index 2726273..dbff417 100644 --- a/Models/Item.cs +++ b/Models/Item.cs @@ -13,5 +13,4 @@ namespace BuecherwurmAPI.Models { public int BookId { get; set; } } - } \ No newline at end of file diff --git a/Models/ItemModel.cs b/Models/ItemModel.cs index f2ef1b1..b4ef5ed 100644 --- a/Models/ItemModel.cs +++ b/Models/ItemModel.cs @@ -6,7 +6,12 @@ using Microsoft.VisualBasic.CompilerServices; namespace BuecherwurmAPI.Models { - internal class ItemModel : IItemRepo + public interface IItem + { + + } + + internal class ItemModel : IItem { private SqliteConnection _dbConnection; @@ -49,13 +54,11 @@ namespace BuecherwurmAPI.Models // using automatically disposes the command after completion using (var command = _dbConnection.CreateCommand()) { - command.CommandText = "SELECT FROM Items"; + command.CommandText = "SELECT * FROM Items"; var dataReader = command.ExecuteReader(); while (dataReader.Read()) { - var returned = (long) dataReader["Returned"] == 1; - items.Add(new Item { ItemId = (long) dataReader["ItemId"], @@ -71,13 +74,11 @@ namespace BuecherwurmAPI.Models using (var command = _dbConnection.CreateCommand()) { command.Parameters.Add(new SqliteParameter("@itemId", itemId)); - command.CommandText = "SELECT FROM Items WHERE Id = @itemId"; + command.CommandText = "SELECT * FROM Items WHERE ItemId = @itemId"; var dataReader = command.ExecuteReader(); while (dataReader.Read()) { - var returned = (long) dataReader["Returned"] == 1; - var item = new Item { ItemId = (long) dataReader["ItemId"], @@ -111,7 +112,6 @@ namespace BuecherwurmAPI.Models { using (var command = _dbConnection.CreateCommand()) { - command.Parameters.Add(new SqliteParameter("@id", SqliteType.Integer)).Value = itemId; command.CommandText = "DELETE FROM Items WHERE ItemId = @itemId"; command.Parameters.Add(new SqliteParameter("@itemId", itemId)); command.ExecuteNonQuery(); diff --git a/Models/KatalogModel.cs b/Models/KatalogModel.cs new file mode 100644 index 0000000..64f2347 --- /dev/null +++ b/Models/KatalogModel.cs @@ -0,0 +1,150 @@ +using System; +using System.Collections.Generic; +using BuecherwurmAPI.Models; +using Microsoft.Data.Sqlite; +using Microsoft.VisualBasic.CompilerServices; + +namespace BuecherwurmAPI.Models +{ + public interface ICatalogue + { + + } + internal class KatalogModel : ICatalogue + { + private SqliteConnection _dbConnection; + + public KatalogModel() + { + var connectionBuilder = new SqliteConnectionStringBuilder {DataSource = "LongWormMemory.db"}; + _dbConnection = new SqliteConnection(connectionBuilder.ConnectionString); + _dbConnection.Open(); + } + + public IEnumerable GetAllBooks() + { + var books= new List(); + + using (var command = _dbConnection.CreateCommand()) + { + command.CommandText = @"SELECT * FROM Books"; + var dataReader = command.ExecuteReader(); + + while (dataReader.Read()) + { + books.Add(new Book + { + Name = (string) dataReader["Books"], + Author = (string) dataReader["Author"], + Country = (string) dataReader["Country"], + Link = (string) dataReader["Link"], + Language = (string) dataReader["Language"], + Pages = (long) dataReader["Pages"], + Year = (long) dataReader["Year"], + ProductId = (long) dataReader["ProductId"], + Category = (CategoryEnum) dataReader["Category"], + ImageLink = (string) dataReader["ImageLink"], + LendTime = (long) dataReader["LendTime"], + LendType = (LendTypeEnum) dataReader["LendType"] + }); + } + } + return books; + } + + public Book GetBookById(long id) + { + using (var command = _dbConnection.CreateCommand()) + { + command.Parameters.Add(new SqliteParameter("@id", SqliteType.Integer)).Value = id; + command.CommandText = @"SELECT * FROM Books WHERE ProductId = @id"; + var dataReader = command.ExecuteReader(); + + var book = new Book + { + Name = (string) dataReader["Books"], + Author = (string) dataReader["Author"], + Country = (string) dataReader["Country"], + Link = (string) dataReader["Link"], + Language = (string) dataReader["Language"], + Pages = (long) dataReader["Pages"], + Year = (long) dataReader["Year"], + ProductId = (long) dataReader["ProductId"], + Category = (CategoryEnum) dataReader["Category"], + ImageLink = (string) dataReader["ImageLink"], + LendTime = (long) dataReader["LendTime"], + LendType = (LendTypeEnum) dataReader["LendType"] + }; + return book; + } + } + public void DeleteBook(long id) + { + using (var command = _dbConnection.CreateCommand()) + { + command.Parameters.Add(new SqliteParameter("@id", SqliteType.Integer)).Value = id; + command.CommandText = @"DELETE * FROM Books WHERE ProductId= @id"; + var dataReader = command.ExecuteReader(); + } + } + + public long AddBook (BookPost book) + { + using (var command = _dbConnection.CreateCommand()) + { + // funktioniert das so? + //muss ProduktId übergeben werden? + command.CommandText = @"INSERT INTO Books (Name, Author, Country, Link, Language, Pages, Year, ProductId, Category, ImageLink, LendTime, LendType) VALUES (@Name, @Author, @Country, @Link, @Language, @Pages, @Year, NULL, @Category, @ImageLink, @LendTime, @LendType )"; + + command.Parameters.Add(new SqliteParameter("@Name", book.Name)); + command.Parameters.Add(new SqliteParameter("@Author", book.Author)); + command.Parameters.Add(new SqliteParameter("@Country", book.Country)); + command.Parameters.Add(new SqliteParameter("@Link", book.Link)); + command.Parameters.Add(new SqliteParameter("@Language", book.Language)); + command.Parameters.Add(new SqliteParameter("@Pages", book.Pages)); + command.Parameters.Add(new SqliteParameter("@Year", book.Year)); + command.Parameters.Add(new SqliteParameter("@Category", book.Category)); + command.Parameters.Add(new SqliteParameter("@ImageLink", book.ImageLink)); + command.Parameters.Add(new SqliteParameter("@LendTime", book.LendTime)); + command.Parameters.Add(new SqliteParameter("@LendType", book.LendType)); + + var success = command.ExecuteNonQuery(); + + if (success == 1) + { + command.CommandText = @"SELECT last_insert_rowid()"; + return (long)command.ExecuteScalar(); + } + + return -1; + } + } + + public long EditBook (long id, Book book) + { + using (var command = _dbConnection.CreateCommand()) + { + // funktioniert das so? + command.Parameters.Add(new SqliteParameter("@id", id)); + command.CommandText = @"UPDATE Books SET (Name, Author, Country, Link, Language, Pages, Year, Category, ImageLink, LendTime, LendType) = (@Name, @Author, @Country, @Link, @Language, @Pages, @Year, @Category, @ImageLink, @LendTime, @LendType ) WHERE ProductId = @id"; + + command.Parameters.Add(new SqliteParameter("@Name", book.Name)); + command.Parameters.Add(new SqliteParameter("@Author", book.Author)); + command.Parameters.Add(new SqliteParameter("@Country", book.Country)); + command.Parameters.Add(new SqliteParameter("@Link", book.Link)); + command.Parameters.Add(new SqliteParameter("@Language", book.Language)); + command.Parameters.Add(new SqliteParameter("@Pages", book.Pages)); + command.Parameters.Add(new SqliteParameter("@Year", book.Year)); + command.Parameters.Add(new SqliteParameter("@Category", book.Category)); + command.Parameters.Add(new SqliteParameter("@ImageLink", book.ImageLink)); + command.Parameters.Add(new SqliteParameter("@LendTime", book.LendTime)); + command.Parameters.Add(new SqliteParameter("@LendType", book.LendType)); + + var success = command.ExecuteNonQuery(); + + return id; + } + } + + } +} \ No newline at end of file diff --git a/Models/Lend.cs b/Models/Lend.cs index d2e7954..50ba663 100644 --- a/Models/Lend.cs +++ b/Models/Lend.cs @@ -1,13 +1,28 @@ using System; +using System.ComponentModel.DataAnnotations; namespace BuecherwurmAPI.Models { public class Lend { + [Key, Required] public long Id { get; set; } + [Required] public long ItemId { get; set;} + [Required] public DateTime ReturnDate { get; set; } + [Required] public string Customer { get; set; } + [Required] public bool Returned { get; set; } } + + public class LendPost + { + public long ItemId {get; set;} + + public DateTime ReturnDate {get; set;} + + public string Customer {get; set;} + } } diff --git a/Models/LendModel.cs b/Models/LendModel.cs index c69942a..3c2bba7 100644 --- a/Models/LendModel.cs +++ b/Models/LendModel.cs @@ -6,11 +6,17 @@ using Microsoft.VisualBasic.CompilerServices; namespace BuecherwurmAPI.Models { - internal class Repository : IRepository + + public interface ILend + { + + } + + internal class LendModel : ILend { private SqliteConnection _dbConnection; - public Repository() + public LendModel() { var connectionBuilder = new SqliteConnectionStringBuilder {DataSource = "LongWormMemory.db"}; _dbConnection = new SqliteConnection(connectionBuilder.ConnectionString); @@ -94,5 +100,26 @@ namespace BuecherwurmAPI.Models } return null; } + + public long insertLendReturningId(LendPost lend) + { + using (var command = _dbConnection.CreateCommand()) + { + command.CommandText = "INSERT INTO Lends VALUES (NULL, @itemId, @returnDate, @customer, false)"; + command.Parameters.Add(new SqliteParameter("@itemId", lend.ItemId)); + command.Parameters.Add(new SqliteParameter("@returnDate", lend.ReturnDate)); + command.Parameters.Add(new SqliteParameter("@customer", lend.Customer)); + + var success = command.ExecuteNonQuery(); + + if (success == 1) + { + command.CommandText = @"SELECT last_insert_rowid()"; + return (long)command.ExecuteScalar(); + } + + return -1; + } + } } } \ No newline at end of file diff --git a/Profiles/LendProfile.cs b/Profiles/LendProfile.cs index 074931c..2d48c44 100644 --- a/Profiles/LendProfile.cs +++ b/Profiles/LendProfile.cs @@ -1,5 +1,4 @@ using AutoMapper; -using BuecherwurmAPI.DTOs; using BuecherwurmAPI.Models; namespace BuecherwurmAPI.Profiles @@ -8,7 +7,7 @@ namespace BuecherwurmAPI.Profiles { public LendProfile() { - CreateMap(); + CreateMap(); } } } \ No newline at end of file diff --git a/Startup.cs b/Startup.cs index b6cc4f5..e8d9d83 100644 --- a/Startup.cs +++ b/Startup.cs @@ -32,7 +32,9 @@ namespace BuecherwurmAPI // Adds a service that is created once per connection. // It takes an interface and a specific implementation. // That allows to swap the implementation easily. - services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); }