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();
            }
        }
示例#3
0
        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"));
            }
        }