public IActionResult AddCredit([FromBody] CreditRecharge recharge) { byte[] encryptedTicketInNDEFMessage; SmartTicket ticket = _dbContext.SmartTickets.Find(recharge.TicketId); // Add online payments logic here to authorize the balance increase if (ticket != null) { try { ticket.Credit += recharge.Amount; EncryptableSmartTicket encryptableTicket = Utility.ConvertToEncryptableSmartTicket(ticket); byte[] encryptedTicket = TicketEncryption.EncryptTicket(encryptableTicket, TicketEncryption.GetPaddedIV(encryptableTicket.CardID)); encryptedTicketInNDEFMessage = new NDEFMessage(encryptedTicket, NDEFRecordType.Types.Text).GetFormattedBlock(); _dbContext.SaveChanges(); _dbContext.CreditTransactions.Add(new CreditTransaction() { Amount = recharge.Amount, CardId = recharge.TicketId, Date = DateTime.Now, Location = "online" }); _dbContext.SaveChanges(); } catch (Exception ex) { return(StatusCode(500, ex.Message)); } return(Ok(encryptedTicketInNDEFMessage)); } else { return(StatusCode((int)HttpStatusCode.InternalServerError, "The ticket has not been found.")); } }
public void RegisterTicketUpdate(EncryptableSmartTicket encryptableTicket) { SmartTicket ticket = _dbContext.SmartTickets.Find(BitConverter.ToString(encryptableTicket.CardID)); if (ticket != null) { ticket.Credit = encryptableTicket.Credit; ticket.TicketType = encryptableTicket.TicketTypeName; ticket.CurrentValidation = encryptableTicket.CurrentValidation; ticket.SessionValidation = encryptableTicket.SessionValidation; ticket.SessionExpense = encryptableTicket.SessionExpense; _dbContext.SaveChanges(); } }
public static EncryptableSmartTicket ConvertToEncryptableSmartTicket(SmartTicket ticket) { string[] cardIdStringArray = ticket.CardId.Trim().Split("-"); byte[] cardId = new byte[cardIdStringArray.Length]; for (int i = 0; i < cardIdStringArray.Length; i++) { cardId[i] = Convert.ToByte(cardIdStringArray[i], 16); } EncryptableSmartTicket encryptableTicket = new EncryptableSmartTicket() { CardID = cardId, Credit = ticket.Credit, CurrentValidation = ticket.CurrentValidation, SessionValidation = ticket.SessionValidation, UsageTimestamp = ticket.UsageTimestamp, SessionExpense = ticket.SessionExpense, TicketTypeName = ticket.TicketType }; return(encryptableTicket); }
public IActionResult ValidateTicket([FromBody] ValidationRegistration registration) { SmartTicket ticket = _dbContext.SmartTickets.Find(registration.TicketId); if (ticket != null && ticket.Username == User.Identity.Name && ticket.Virtual) { try { EncryptableSmartTicket encryptableTicket = Utility.ConvertToEncryptableSmartTicket(ticket); ValidationManager manager = new ValidationManager(encryptableTicket, this, registration.Location); manager.ValidateTicket(); return(Ok("Ticket validated")); } catch (Exception ex) { return(StatusCode((int)HttpStatusCode.InternalServerError, ex.Message)); } } else { return(StatusCode((int)HttpStatusCode.InternalServerError, ticket == null ? "No tickets found with the provided id" : ticket.Username != User.Identity.Name ? "The user is not the owner of the ticket" : "The ticket is not virtual")); } }