forked from AcaMate/AcaMate_API
311 lines
10 KiB
C#
311 lines
10 KiB
C#
using System.IdentityModel.Tokens.Jwt;
|
|
using System.Security.Claims;
|
|
using Microsoft.IdentityModel.Tokens;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using System.Linq.Expressions;
|
|
using Microsoft.Extensions.Logging;
|
|
using Microsoft.EntityFrameworkCore.Query;
|
|
using MySqlConnector;
|
|
using System.Linq;
|
|
|
|
using AcaMate.Common.Data;
|
|
using AcaMate.Common.Token;
|
|
using AcaMate.Common.Models;
|
|
|
|
using AcaMate.V1.Models;
|
|
using AcaMate.V1.Services;
|
|
|
|
namespace AcaMate.V1.Controllers;
|
|
|
|
[ApiController]
|
|
[Route("/api/v1/in/user")]
|
|
[ApiExplorerSettings(GroupName = "사용자")]
|
|
public class UserController : ControllerBase
|
|
{
|
|
private readonly AppDbContext _dbContext;
|
|
private readonly ILogger<UserController> _logger;
|
|
private readonly JwtTokenService _jwtTokenService;
|
|
private readonly IRepositoryService _repositoryService;
|
|
|
|
public UserController(AppDbContext dbContext, ILogger<UserController> logger, JwtTokenService jwtTokenService, IRepositoryService repositoryService)
|
|
{
|
|
_dbContext = dbContext;
|
|
_logger = logger;
|
|
_jwtTokenService = jwtTokenService;
|
|
_repositoryService = repositoryService;
|
|
}
|
|
|
|
[HttpGet]
|
|
[CustomOperation("회원 정보 조회", "회원 정보 조회", "사용자")]
|
|
public IActionResult GetUserData(string uid)
|
|
{
|
|
if (string.IsNullOrEmpty(uid)) return BadRequest(DefaultResponse.InvalidInputError);
|
|
|
|
try
|
|
{
|
|
var user = _dbContext.User
|
|
.Where(u => u.uid == uid)
|
|
.Select(u => new User
|
|
{
|
|
uid = u.uid,
|
|
name = u.name,
|
|
auto_login_yn = u.auto_login_yn,
|
|
birth = u.birth,
|
|
device_id = u.device_id,
|
|
login_date = u.login_date,
|
|
type = u.type
|
|
})
|
|
.FirstOrDefault();
|
|
|
|
var response = new APIResponseStatus<User>
|
|
{
|
|
status = new Status
|
|
{
|
|
code = "000",
|
|
message = "정상"
|
|
},
|
|
data = user
|
|
};
|
|
return Ok(response.JsonToString());
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return StatusCode(500, DefaultResponse.UnknownError);
|
|
}
|
|
}
|
|
|
|
[HttpGet("login")]
|
|
[CustomOperation("SNS 로그인", "로그인 후 회원이 있는지 확인", "사용자")]
|
|
public async Task<IActionResult> Login(string acctype, string sns_id)
|
|
{
|
|
// API 동작 파라미터 입력 값 확인
|
|
if (string.IsNullOrEmpty(acctype) && string.IsNullOrEmpty(sns_id))
|
|
return BadRequest(DefaultResponse.InvalidInputError);
|
|
|
|
try
|
|
{
|
|
var login = await _dbContext.Login
|
|
.FirstOrDefaultAsync(l => l.sns_type == acctype && l.sns_id == sns_id);
|
|
|
|
if (login != null)
|
|
{
|
|
// 로그인 정보가 존재 하는 상황
|
|
var uid = login.uid;
|
|
|
|
var user = await _dbContext.User
|
|
.FirstOrDefaultAsync(u => u.uid == uid);
|
|
|
|
if (user != null)
|
|
{
|
|
// 정상적으로 User 테이블에도 있는것이 확인 됨
|
|
user.login_date = DateTime.Now;
|
|
await _dbContext.SaveChangesAsync();
|
|
|
|
// 토큰 생성은 로그인이 이제 되고 나서 한다.
|
|
var accessToken = _jwtTokenService.GenerateJwtToken(uid);//, "Normal");
|
|
var refreshToken = _jwtTokenService.GenerateRefreshToken(uid);
|
|
_logger.LogInformation($"{uid}: {accessToken}, {refreshToken}");
|
|
|
|
await _repositoryService.SaveData<RefreshToken, string>(refreshToken, rt => rt.uid);
|
|
|
|
|
|
var response = new APIResponseStatus<dynamic>
|
|
{
|
|
status = new Status
|
|
{
|
|
code = "000",
|
|
message = "정상"
|
|
},
|
|
data = new
|
|
{
|
|
token = accessToken,
|
|
refresh = refreshToken.refresh_token
|
|
}
|
|
};
|
|
return Ok(response.JsonToString());
|
|
}
|
|
}
|
|
// case 1: Login 테이블에 값이 없다 == 로그인이 처음
|
|
// case 2: User 테이블에 값이 없다 == 이건 문제가 있는 상황 -> 해결은 회원가입 재 진행 시도
|
|
// Login에는 있는데 User 테이블에 없다? 말이 안되긴 하는데...
|
|
return Ok(new APIResponseStatus<dynamic>
|
|
{
|
|
status = new Status
|
|
{
|
|
code = "010",
|
|
message = "로그인 정보 없음 > 회원 가입 진행"
|
|
},
|
|
data = new
|
|
{
|
|
token = "",
|
|
refresh = ""
|
|
// bidList = new string[] { }
|
|
}
|
|
}.JsonToString());
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogInformation($"[로그인] 에러 발생 : {ex}");
|
|
return StatusCode(500, DefaultResponse.UnknownError);
|
|
}
|
|
}
|
|
|
|
[HttpGet("academy")]
|
|
[CustomOperation("학원 리스트 확인", "사용자가 등록된 학원 리스트 확인", "사용자")]
|
|
public async Task<IActionResult> ReadAcademyInfo(string token, string refresh)
|
|
{
|
|
_logger.LogInformation($"토큰 : {token}, {refresh}");
|
|
|
|
if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh))
|
|
{
|
|
var error = DefaultResponse.InvalidInputError;
|
|
return Ok(error);
|
|
}
|
|
|
|
try
|
|
{
|
|
var validateToken = await _repositoryService.ValidateToken(token, refresh);
|
|
var uid = validateToken.uid;
|
|
|
|
var userAcademy = await _dbContext.UserAcademy
|
|
.Where(ua => ua.uid == uid)
|
|
.Select(ua => ua.bid)
|
|
.ToListAsync();
|
|
|
|
|
|
var academies = await _dbContext.Academy
|
|
.Where(a => userAcademy.Contains(a.bid))
|
|
.Select(a => new AcademyName
|
|
{
|
|
bid = a.bid,
|
|
name = a.business_name
|
|
})
|
|
.ToListAsync();
|
|
|
|
var response = new APIResponseStatus<List<AcademyName>>
|
|
{
|
|
status = new Status
|
|
{
|
|
code = "000",
|
|
message = "정상"
|
|
},
|
|
data = academies
|
|
};
|
|
|
|
|
|
return Ok(response);
|
|
}
|
|
catch (SecurityTokenException tokenEx)
|
|
{
|
|
_logger.LogInformation($"[로그인][오류] 토큰 검증 : {tokenEx}");
|
|
return StatusCode(500, DefaultResponse.InvalidInputError);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogInformation($"[로그인][오류] 에러 발생 : {ex}");
|
|
return StatusCode(500, DefaultResponse.UnknownError);
|
|
}
|
|
|
|
}
|
|
|
|
[HttpPost("register")]
|
|
[CustomOperation("회원 가입", "사용자 회원 가입", "사용자")]
|
|
public async Task<IActionResult> UserRegister([FromBody] UserAll request)
|
|
{
|
|
if (!ModelState.IsValid) return BadRequest(DefaultResponse.InvalidInputError);
|
|
|
|
var atIndext = request.email.IndexOf('@');
|
|
var localPart_email = request.email.Substring(0, atIndext);
|
|
var uid = $"AM{localPart_email}{DateTime.Now:yyyyMMdd}";
|
|
|
|
var user = new User
|
|
{
|
|
uid = uid,
|
|
name = request.name,
|
|
birth = request.birth,
|
|
type = request.type,
|
|
device_id = request.device_id,
|
|
auto_login_yn = request.auto_login_yn,
|
|
login_date = request.login_date
|
|
};
|
|
var login = new Login
|
|
{
|
|
uid = uid,
|
|
sns_id = request.sns_id,
|
|
sns_type = request.sns_type
|
|
};
|
|
|
|
var permission = new Permission
|
|
{
|
|
uid = uid,
|
|
location_yn = request.location_yn,
|
|
camera_yn = request.camera_yn,
|
|
photo_yn = request.photo_yn,
|
|
push_yn = request.push_yn,
|
|
market_app_yn = request.market_app_yn,
|
|
market_sms_yn = request.market_sms_yn,
|
|
market_email_yn = request.market_email_yn
|
|
};
|
|
|
|
var contact = new Contact
|
|
{
|
|
uid = uid,
|
|
email = request.email,
|
|
phone = request.phone,
|
|
address = request.address
|
|
};
|
|
|
|
|
|
if (await _repositoryService.SaveData<User, string>(user, u => u.uid))
|
|
{
|
|
await _repositoryService.SaveData<Login, string>(login, l => l.sns_id);
|
|
await _repositoryService.SaveData<Permission, string>(permission, p => p.uid);
|
|
await _repositoryService.SaveData<Contact, string>(contact, c => c.uid);
|
|
}
|
|
|
|
// TO-DO: jwt 토큰 만들어서 여기서 보내는 작업을 해야 함
|
|
var token = _jwtTokenService.GenerateJwtToken(uid);//, "admin");
|
|
var refreshToken = _jwtTokenService.GenerateRefreshToken(uid);
|
|
await _repositoryService.SaveData<RefreshToken, string>(refreshToken, rt => rt.uid);
|
|
|
|
var result = new APIResponseStatus<dynamic>()
|
|
{
|
|
status = new Status()
|
|
{
|
|
code = "000",
|
|
message = "정상"
|
|
},
|
|
data = new
|
|
{
|
|
accessToken = token,
|
|
refreshToken = refreshToken.refresh_token
|
|
}
|
|
};
|
|
|
|
return Ok(result.JsonToString());
|
|
}
|
|
|
|
[HttpGet("logout")]
|
|
[CustomOperation("로그아웃", "사용자 로그아웃", "사용자")]
|
|
public async Task<IActionResult> LogOut(string token, string refresh) //([FromBody] UserAll request)
|
|
{
|
|
/* */
|
|
// var value = await ValidateToken(token, refresh);
|
|
// _logger.LogInformation(value.uid);
|
|
// _logger.LogInformation(value.refresh);
|
|
// _logger.LogInformation(value.token);
|
|
/* */
|
|
|
|
|
|
return Ok("로그아웃");
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |