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 +"/rest/users/" +uId; Session session = SessionManager.getInstance().getSession(); Token token = createToken(uId); LogUtils.info(token.token); session.save(token); User testUser = new User(name, uId, uri, iconImage,token.token); Password password = new Password(pw, uId); session.save(testUser); session.save(password); 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, String token) { //リレーションがうまく機能していないため、すべてここで削除しています。 if(checkToken(uId, token)){ 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(session.get(Password.class, uId)); //パスワードの削除 session.delete(session.get(Token.class, token)); //tokenの削除(応急処置) for(Token deleteToken : deleteUser.getTokens()){ session.delete(deleteToken); //tokenの削除 } session.delete(deleteUser); 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)) { Session session = SessionManager.getInstance().getSession(); Token token = getInstance().createToken(uId); session.save(token); return token; }else{ //例外処理 return null; } } public static DeleteResult logout(String uId,String token) { /** * トークンを削除しログインフラグを操作するためのメソッド * * TODO: queryの文に条件文を追加 */ 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)); if(session.get(Token.class, token) != null) { user.getTokens().remove(session.get(Token.class, token)); session.delete(session.get(Token.class, token)); if(user.getTokens().size() == 0){ user.login = false; } return DeleteResult.SUCCESS; } } } } //例外処理 return null; } public static boolean checkToken(String uId, String token) { /** * uIdとtokenを比較し結果を返すためのメソッド * @param uId * @param */ Session session = SessionManager.getInstance().getSession(); List tokenList = session.createQuery( "select token from Token where uId =\'" +uId+"\'" ).list(); if(tokenList.contains(token)){ return true; } return false; } 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; } } }