Exemplo n.º 1
0
        public async Task <IActionResult> Login([FromBody] LoginDto loginDto)
        {
            var userDetails = await _discordDataService.GetDiscordUserDetailsAsync(loginDto.AccessToken);

            var userGuilds = await _discordDataService.GetDiscordUserGuildsAsync(loginDto.AccessToken);

            var userId            = userDetails.Id;
            var userName          = userDetails.Username;
            var userDiscriminator = userDetails.Discriminator;
            var userEmail         = userDetails.Email;

            var user =
                await _userService.GetByUsernameAndDiscriminatorAsync(userName, userDiscriminator);

            // User is not stored in our database yet
            if (Equals(user, default(User)))
            {
                var userToRegister = new User
                {
                    Discriminator = userDiscriminator,
                    UserId        = userId,
                    UserName      = userName,
                    Email         = userEmail,
                    // AccessToken = id
                };

                var savedUser = await _userService.AddAsync(userToRegister);

                foreach (var userGuild in userGuilds.Where(userGuild => userGuild.Owner))
                {
                    await _guildService.AddAsync(new Guild
                    {
                        GuildId = userGuild.Id
                    });
                }

                await _guildService.SaveAllAsync();

                /*
                 * if (!await _botService.GetIfUserIsSupertesterAsync(user.UserId))
                 * {
                 *  return Forbid();
                 * }
                 */

                return(Ok(new
                {
                    token = await GenerateJwtTokenAsync(savedUser, loginDto.AccessToken),
                    user = new { savedUser.Id, savedUser.UserName, savedUser.Email },
                    preferences = new { savedUser.AppPreferences.Language, savedUser.AppPreferences.Theme }
                }));
            }
            // User is already stored in our database

            // if (user.AccessToken != id) user.AccessToken = id;
            foreach (var userGuild in userGuilds)
            {
                var guilds = await _guildService.GetAllAsync();

                if (!guilds.Select(g => g.GuildId).ToList().Contains(userGuild.Id))
                {
                    if (userGuild.Owner)
                    {
                        await _guildService.AddAsync(new Guild
                        {
                            GuildId = userGuild.Id
                        });
                    }
                }
            }

            await _guildService.SaveAllAsync();

            /*
             *  if (!await _botService.GetIfUserIsSupertesterAsync(user.UserId))
             *  {
             *      return Forbid();
             *  }
             */

            // Check if user is banned or suspended
            if (user.LockoutEnd != null || user.LockoutEnd > DateTime.Now)
            {
                // If so, we will not let them in, and provide the reason for that
                return(Unauthorized(new { reason = "banned", expiresAt = user.LockoutEnd }));
            }

            return(Ok(new
            {
                token = await GenerateJwtTokenAsync(user, loginDto.AccessToken),
                user = new { user.Id, user.UserName, user.Email },
                preferences = new { user.AppPreferences.Language, user.AppPreferences.Theme }
            }));

            // return Ok(await GenerateJwtTokenAsync(user));
        }