void ValidateRequest(RecordRewardRequest request)
        {
            User user = userRepository.TryGet(request.Username)?.ToServiceModel();

            if (user is null)
            {
                AuthenticationException ex = new AuthenticationException("The provided user is not registered");

                logger.Error(
                    MyOperation.RecordReward,
                    OperationStatus.Failure,
                    ex,
                    new LogInfo(MyLogInfoKey.User, request.Username));

                throw ex;
            }

            bool isTokenValid = requestHmacEncoder.IsTokenValid(request.HmacToken, request, user.SharedSecretKey);

            if (!isTokenValid)
            {
                AuthenticationException ex = new AuthenticationException("The provided HMAC token is not valid");

                logger.Error(
                    MyOperation.RecordReward,
                    OperationStatus.Failure,
                    ex,
                    new LogInfo(MyLogInfoKey.User, request.Username),
                    new LogInfo(MyLogInfoKey.GiveawaysProvider, request.GiveawaysProvider),
                    new LogInfo(MyLogInfoKey.GiveawayId, request.GiveawayId));

                throw ex;
            }
        }
        public ActionResult RecordReward(
            [FromQuery] string username,
            [FromQuery] string gaProvider,
            [FromQuery] string gaId,
            [FromQuery] string steamUsername,
            [FromQuery] string steamAppId,
            [FromQuery] string activationKey,
            [FromQuery] string hmac)
        {
            try
            {
                RecordRewardRequest request = new RecordRewardRequest
                {
                    Username          = username,
                    GiveawaysProvider = gaProvider,
                    GiveawayId        = gaId,
                    SteamUsername     = steamUsername,
                    SteamAppId        = steamAppId,
                    ActivationKey     = activationKey,
                    HmacToken         = hmac
                };

                service.RecordReward(request);

                return(Ok());
            }
            catch (Exception ex)
            {
                ErrorResponse response = new ErrorResponse(ex);
                return(BadRequest(response));
            }
        }
        Reward GetRewardObjectFromRequest(RecordRewardRequest request)
        {
            Reward reward = new Reward();

            reward.Id = $"{request.GiveawaysProvider}-{request.GiveawayId}-{reward.SteamUsername}";
            reward.GiveawaysProvider = request.GiveawaysProvider;
            reward.GiveawayId        = request.GiveawayId;
            reward.SteamUsername     = request.SteamUsername;
            reward.ActivationKey     = request.ActivationKey;

            reward.SteamApp    = new SteamApp();
            reward.SteamApp.Id = request.SteamAppId;

            return(reward);
        }
        public void RecordReward(RecordRewardRequest request)
        {
            logger.Info(
                MyOperation.RecordReward,
                OperationStatus.Started,
                new LogInfo(MyLogInfoKey.User, request.Username),
                new LogInfo(MyLogInfoKey.GiveawaysProvider, request.GiveawaysProvider),
                new LogInfo(MyLogInfoKey.GiveawayId, request.GiveawayId));

            ValidateRequest(request);

            Reward reward = GetRewardObjectFromRequest(request);

            reward.SteamApp = storefrontDataRetriever.GetAppData(reward.SteamApp.Id).ToServiceModel();

            if (WasRewardAlreadyRecorded(reward))
            {
                logger.Warn(
                    MyOperation.RecordReward,
                    OperationStatus.Failure,
                    "Reward already recorded",
                    new LogInfo(MyLogInfoKey.User, request.Username),
                    new LogInfo(MyLogInfoKey.GiveawaysProvider, request.GiveawaysProvider),
                    new LogInfo(MyLogInfoKey.GiveawayId, request.GiveawayId));

                return;
            }

            StoreReward(reward);
            notificationSender.SendNotificationAsync(reward);

            logger.Info(
                MyOperation.RecordReward,
                OperationStatus.Success,
                new LogInfo(MyLogInfoKey.User, request.Username),
                new LogInfo(MyLogInfoKey.GiveawaysProvider, request.GiveawaysProvider),
                new LogInfo(MyLogInfoKey.GiveawayId, request.GiveawayId));
        }