public ResponseContext Post(Dictionary <string, object> param) { RequestContext request = (RequestContext)param["request"]; MtcgClient client = (MtcgClient)param["client"]; if (!request.Headers.ContainsKey("Content-Type") || request.Headers["Content-Type"] != "application/json") { return(new ResponseContext(request, new KeyValuePair <StatusCode, object>(StatusCode.UnsupportedMediaType, ""))); } if (client.User.Deck.GetAllCards().Any()) { return(new ResponseContext(request, new KeyValuePair <StatusCode, object>(StatusCode.Conflict, "Deck is already configured. Use PUT instead if you want to update"))); } CardCollectionDto deckDto = JsonSerializer.Deserialize <CardCollectionDto>(request.Payload); deckDto.CardCollectionType = typeof(Deck); Deck deck; if (deckDto == null || deckDto.CardGuids.Count != 4 || (deck = deckDto.ToObject() as Deck) == null) { return(new ResponseContext(request, new KeyValuePair <StatusCode, object>(StatusCode.BadRequest, "Either the deck does not contain 4 cards or some cards do not exist"))); } return(new ResponseContext(request, _userController.ConfigureDeck(ref client, deck))); }
public virtual ResponseContext Post(Dictionary <string, object> param) { RequestContext request = (RequestContext)param["request"]; if (!request.Headers.ContainsKey("Content-Type") || request.Headers["Content-Type"] != "application/json") { return(new ResponseContext(request, new KeyValuePair <StatusCode, object>(StatusCode.UnsupportedMediaType, ""))); } CardCollectionDto packageDto = JsonSerializer.Deserialize <CardCollectionDto>(request.Payload); packageDto.CardCollectionType = typeof(Package); Package package; if (packageDto == null || packageDto.CardGuids.Count != 5 || (package = packageDto.ToObject() as Package) == null) { return(new ResponseContext(request, new KeyValuePair <StatusCode, object>(StatusCode.BadRequest, "Either the package does not contain 5 cards or some cards do not exist"))); } return(new ResponseContext(request, _packageController.CreatePackage(package))); }
public bool AcquirePackage(ref MtcgClient client, PackageType type) { Package package = null; CardCollectionDto packageDto = null; int price = 0; string statement; if (type == PackageType.Random) { packageDto = new CardCollectionDto() { CardGuids = AcquireRandomPackage(), CardCollectionType = typeof(Package) }; price = GetPackagePrice(PackageType.Random); } else { statement = "SELECT * FROM mtcg.\"Package\" p, mtcg.\"PackageType\" pT " + "WHERE pt.\"Id\"=@packageTypeId AND p.\"PackageTypeId\"=pT.\"Id\" " + "ORDER BY RANDOM() " + "LIMIT 1;"; using (NpgsqlCommand cmd = new NpgsqlCommand(statement, PostgreSQLSingleton.GetInstance.Connection)) { cmd.Parameters.Add("packageTypeId", NpgsqlDbType.Integer).Value = (int)type; cmd.Prepare(); using (var reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) { if (reader.HasRows) { reader.Read(); packageDto = new CardCollectionDto() { CardGuids = JsonSerializer.Deserialize <List <Guid> >(reader["Cards"].ToString()), CardCollectionType = typeof(Package) }; price = (int)reader["Price"]; } }; } } package = packageDto?.ToObject() as Package; if (package == null) { return(false); } package.PackageType = type; //save old properties to fallback if necessary Stack <Package> oldUnopenedPackages = new Stack <Package>(new Stack <Package>(client.User.CurrentUnopenedPackages)); client.User.RemoveCoins(price); client.User.AddPackage(package); statement = "UPDATE mtcg.\"User\" " + "SET \"Coins\"=@coins, \"UnopenedPackages\"=@unopenedPackages " + "WHERE \"Username\"=@username AND \"Password_Hash\"=@password"; string[] credentials = client.User.Credentials.Split(':', 2); using (NpgsqlCommand cmd = new NpgsqlCommand(statement, PostgreSQLSingleton.GetInstance.Connection)) { cmd.Parameters.Add("username", NpgsqlDbType.Varchar).Value = credentials[0]; cmd.Parameters.Add("password", NpgsqlDbType.Bytea).Value = Encoding.UTF8.GetBytes(credentials[1]); cmd.Parameters.Add("coins", NpgsqlDbType.Integer).Value = client.User.Coins; cmd.Parameters.Add("unopenedPackages", NpgsqlDbType.Varchar).Value = JsonSerializer.Serialize(client.User.CurrentUnopenedPackages); cmd.Prepare(); if (cmd.ExecuteNonQuery() != 1) { client.User.AddCoins(price); client.User.CurrentUnopenedPackages = oldUnopenedPackages; return(false); } } return(true); }