Newer
Older
CosmosServer / src / main / java / com / example / cosmos_serversb / models / Users.java
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;
        }
    }
}