using Microsoft.Extensions.Configuration; using MySqlConnector; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using uWine.Core.Domain.Entities; using uWine.Core.Domain.Repositories; using uWine.Core.Infrastructure.Helpers; namespace uWine.Core.Infrastructure.Repository { public class MariaDbVineyardRepository : MariaDbServerRepository, IVineyardRepository { public MariaDbVineyardRepository(IConfiguration configuration) : base(configuration) { } public void Insert(Vineyard vineyard, int ownerId) { using (var connection = Connection()) { connection.Open(); var command = new MySqlCommand(@$"INSERT INTO t_vineyard ( name, location, hectares, latitude, longitude ) VALUES ( @name, @location, @hectares, @latitude, @longitude ); LAST_INSERT_ID();", connection); command.Parameters.AddWithValue("@name", vineyard.Name); command.Parameters.AddWithValue("@location", vineyard.Location); command.Parameters.AddWithValue("@hectares", vineyard.Hectares); command.Parameters.AddWithValue("@latitude", vineyard.Coordinates.Latitude); command.Parameters.AddWithValue("@longitude", vineyard.Coordinates.Longitude); using (var reader = command.ExecuteReader()) { if (reader.Read()) { vineyard.Id = reader.GetInt32(0); } } var command2 = new MySqlCommand("INSERT INTO t_owners_vineyards (owner_id, vineyard_id) VALUES (@ownerId, @vineyardId)", connection); command2.Parameters.AddWithValue("@ownerId", ownerId); command2.Parameters.AddWithValue("@vineyardId", vineyard.Id); command2.ExecuteNonQuery(); } } public void InsertArea(Dictionary coordinates, int vineyardId) { var polygon = CoordinatesHelper.ToWktPolygon(coordinates); using (var connection = Connection()) { connection.Open(); var command = new MySqlCommand("UPDATE t_vineyard SET area = ST_GeomFromText(@polygon, 4326) where id = @id", connection); command.Parameters.AddWithValue("@id", vineyardId); command.Parameters.AddWithValue("@polygon", polygon); command.ExecuteNonQuery(); } } public List GetOwnerVineyards(int ownerId) { var vineyards = new List(); using (var connection = Connection()) { connection.Open(); var command = new MySqlCommand("SELECT v.id, v.name, v.location, v.hectares, v.latitude, v.longitude " + "FROM t_vineyard v " + "JOIN t_owners_vineyards ov ON v.id = ov.vineyard_id " + "WHERE ov.owner_id = @ownerId", connection); command.Parameters.AddWithValue("@ownerId", ownerId); using (var reader = command.ExecuteReader()) { while (reader.Read()) { vineyards.Add(Vineyard.FromRecord(reader)); } } } return vineyards; } } }