package com.example.cosmos_serversb.models;
import java.util.List;
import java.util.UUID;
import javax.inject.Singleton;
import javax.ws.rs.WebApplicationException;
import com.example.cosmos_serversb.entities.*;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Value;
import com.example.common.LogUtils;
@Singleton
public class Users {
/**
* ユーザの情報を操作するためクラス
*
* @param Users
* @param SessionFactory
* @param baseURI
* @param AppName
*
* TODO:statusコードを返す
* TODO:baseURIなどは定義ファイルで保持させる
*/
private static Users theInstance = null;
private static SessionFactory sessionFactory;
private static String baseURI="http://nitta-lab-www.is.konan-u.ac.jp/";
private static String AppName="cosmos";
private Users() {
sessionFactory = SessionFactoryManager.getInstance().getSessionFactory();
}
public static Users getInstance() {
if (theInstance == null) {
theInstance = new Users();
}
return theInstance;
}
public static Token createToken(String uId) {
/**
* Tokenを作成返すためのメソッド
*
* @param uId String
* @param token_str String
* @return token Token
*
* TODO :どこでトークンを保存するか要検討
*/
String token = UUID.randomUUID().toString();
Token return_token =new Token(token, uId);
return return_token;
}
public static String createUId() {
/**
* uIdを作成し既存していないかチェック後DBに保存し作成したuIdを返すためのメソッド
*
* @param uId String
*
*/
String uId = UUID.randomUUID().toString();
return uId;
}
public static User createUser(String name, String pw, String iconImage) {
if(name == null || pw == null){
return null; //not-null制約
}
String uId = getInstance().createUId();
String uri = baseURI + AppName +"/users/" +uId;
Session session = SessionManager.getInstance().getSession();
Token token = createToken(uId);
LogUtils.info(token.token);
User testUser = new User(name, uId, uri, iconImage,token.token);
Password password = new Password(pw, uId);
session.save(testUser);
session.save(password);
session.save(token);
return testUser;
}
public static User setUser(String uId, String name, String pw, String iconImage) {
/**
* Userの情報を変更するためのメソッド
*
* @param uId String
* @param name String
* @param pw String
* @param iconImage String
*
* TODO: checkPasswordメソッドを用いパスワードを確認する
*/
if(name == null || pw == null){
return null; //not-null制約
}
Session session = SessionManager.getInstance().getSession();
List usersList = session.createQuery( "from User" ).list();
List passwordList = session.createQuery("from Password").list();
for ( User user : (List<User>) usersList ) {
if (user.getuId().equals(uId)) {//if (user.getuId().equals(uId) || password.getPw().equals(pw)) {
user.setName(name);
for ( Password password : (List<Password>) passwordList ) {
password.setPw(pw);
session.update(password);
}
if(iconImage != null) {
user.setIconUri(iconImage);
}
session.update(user);
break;
}
}
User findUser = (User) session.load(User.class, uId);
return findUser;
}
public static User getUserById(String uId) {
/**
* 与えられたuIdのUser情報を返すためのメソッド
* @param uId
*
*/
Session session = SessionManager.getInstance().getSession();
List usersList = session.createQuery( "from User" ).list();
//uIdを比較し、一致した場合はNameとiconUriを返す。一致しない場合はbreak
for ( User user : (List<User>) usersList ) {
if (user.getuId().equals(uId)) {
User findUser = (User) session.load(User.class, uId);
// System.out.println(mapper.valueToTree(findUser).toString());
return findUser;
}
}
//例外処理
return null;
}
public static User getUserByToken(String token) {
//与えられたTokenに紐づくUser情報を返す
User testUser = new User("test", getInstance().createUId(), "http://test.com", "http://localhost:8080/iconImage/b4bb7db0-cc0c-4ee1-816f-8304add12da8.jpg", "1234567890");
return testUser;
}
public static DeleteResult deleteUser(String uId) {
Session session = SessionManager.getInstance().getSession();
User deleteUser = (User) session.get(User.class, uId);
if(deleteUser != null){
for(Group group : deleteUser.getGroups()){
if(group.getMembers().size() == 1){
//グループにユーザが存在しなくなるため、グループごと削除する。
Groups.getInstance().deleteGroup(group.getgId());
}else{
//該当ユーザをグループから退会。
group.deleteMember(deleteUser);
}
}
deleteUser.groups.clear();
session.delete(deleteUser);
System.out.println("massage: Already Deleted");
return DeleteResult.SUCCESS;
}
return DeleteResult.FAILURE;
}
public static Token login(String uId,String pw) {
/**
* tokenを作成したりloginフラグの操作を行うフラグ
* @param uId String
* @param pw String
*
*/
if(checkPassword(uId,pw)) {
Token testtoken = getInstance().createToken(uId);
return testtoken;//testToken
}else{
//例外処理
return null;
}
}
public static DeleteResult logout(String uId,String token) {
/**
* トークンを削除しログインフラグを操作するためのメソッド
*
* TODO: queryの文に条件文を追加
* TODO :logout 変更
*/
Session session = SessionManager.getInstance().getSession();
List usersList = session.createQuery( "from User" ).list();
for ( User user : (List<User>) usersList ) {
if (user.getuId().equals(uId)) {
if (Users.getInstance().getUserByToken(token).uId == null) {
return DeleteResult.FAILURE;
} else {
// Users.getInstance().getUserByToken(token).token.remove(Users.getInstance().getUserByToken(token).token.indexOf(token));
return DeleteResult.SUCCESS;
}
}
}
//例外処理
return null;
}
public static boolean checkToken(String uId, String token) {
/**
* uIdとtokenを比較し結果を返すためのメソッド
* @param uId
* @param
*/
return true;
}
public static boolean checkPassword(String uId, String pw) {
/**
* UIDをキーにパスワードを引き抜き参照
* @param uId
* @param pw String userが提示したパスワード
* @param pw_ans String DBに格納されたパスワード
*
* TODO:パスワードはhash、塩コショウかけて味を調える
*/
Session session = SessionManager.getInstance().getSession();
Password findPassword = (Password) session.load(Password.class, uId);
if (findPassword.getPw().equals(pw)) {
return true;
} else {
return false;
}
}
}