Package com.appspot.plucial.service

Source Code of com.appspot.plucial.service.UserService

package com.appspot.plucial.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

import org.slim3.datastore.Datastore;
import org.slim3.datastore.S3QueryResultList;
import org.slim3.memcache.Memcache;
import org.slim3.util.StringUtil;

import com.appspot.plucial.Constants;
import com.appspot.plucial.dao.UserModelDao;
import com.appspot.plucial.meta.UserModelMeta;
import com.appspot.plucial.model.ActivityModel;
import com.appspot.plucial.model.DateModel;
import com.appspot.plucial.model.UserModel;
import com.appspot.plucial.utils.Utils;
import com.google.api.services.plus.model.Person.Cover;
import com.google.api.services.plus.model.Person.Image;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.Text;


public class UserService {

    private static final UserModelDao userModelDao = new UserModelDao();

    /**
     *  ユーザーカウントキャッシュキー
     */
    public static final String SERVICE_USER_COUNT = "service_user_count";

    /**
     *  ユーザーリストキャッシュキー
     */
    public static final String USER_LIST_FIRST_30 = "user_list_first_30";

    /**
     *  全ユーザーリストキャッシュキー(10000件まで)
     */
    public static final String ALL_USER_LIST = "all_user_list";

    /**
     *  グループユーザーリストキャッシュキー
     */
    public static final String GROUP_USER_LIST = "group_user_list";


    /**
     * ユーザーカウントの取得
     * @return
     */
    public static int getUserCount() {

        int serviceUserCount = (Integer) (Memcache.get(SERVICE_USER_COUNT) == null ? 0 : Memcache.get(SERVICE_USER_COUNT));
        if(serviceUserCount > 0) return serviceUserCount;

        serviceUserCount = userModelDao.getUserCount();
        if(serviceUserCount > 0) Memcache.put(SERVICE_USER_COUNT, serviceUserCount);

        return serviceUserCount;
    }

    /**
     * ユーザーリストを取得
     * @return
     */
    public static S3QueryResultList<UserModel> getUserList(String cursor) {

        S3QueryResultList<UserModel> list = null;

        // 最初のページをキャッシュする
        if (StringUtil.isEmpty(cursor)) {
            // Memcache に存在した場合はMemcache内のmodelを返す
            list = Memcache.get(USER_LIST_FIRST_30);
            if(Utils.isNotEmpty(list)) return list;

            // DBから取得し、存在した場合はMemcacheに入れる
            list = userModelDao.getUserList(Constants.SERVICE_USER_LIST_LIMIT_NUM);
            if(Utils.isNotEmpty(list)) Memcache.put(USER_LIST_FIRST_30, list);

        }else {
            list = userModelDao.getUserList(Constants.SERVICE_USER_LIST_LIMIT_NUM, cursor);

        }

        return list == null ? new S3QueryResultList<UserModel>(new ArrayList<UserModel>(), null, null, null, false) : list;
    }

    /**
     * すべてのユーザーリストを取得
     * @return
     */
    public static List<UserModel> getAllUserList() {
        List<UserModel> userList = Memcache.get(ALL_USER_LIST);
        if(Utils.isNotEmpty(userList)) return userList;

        userList = userModelDao.getAllUserList();
        if(Utils.isNotEmpty(userList)) Memcache.put(ALL_USER_LIST, userList);

        return userList;
    }

    /**
     * グループのユーザーリストを取得
     * @param groupId
     * @return
     */
    public static List<UserModel> getGroupUserList(int groupId) {

        List<UserModel> userList = Memcache.get(getGroupUserListMemcache(groupId));
        if(Utils.isNotEmpty(userList)) return userList;

        userList = userModelDao.getGroupUserList(groupId);
        if(Utils.isNotEmpty(userList)) Memcache.put(getGroupUserListMemcache(groupId), userList);

        return userList == null ? new ArrayList<UserModel>() : userList;
    }

    /**
     * ユーザーの取得
     * @param email
     * @return
     */
    public static UserModel getOrNull(String userID) {

        Key key = createKey(userID);
        UserModel model = Memcache.get(key.toString());
        if(model != null) return model;

        model = userModelDao.getOrNull(key);
        if(model != null) Memcache.put(model.getKey().toString(), model);

        return model;
    }

    /**
     * PUT
     * @param model
     * @return
     */
    public static UserModel put(UserModel model) {
        // 永久化
        userModelDao.put(model);

        // 自信のキャッシュをクリア
        Memcache.delete(model.getKey().toString());

        // グループのキャッシュをクリア
        clearGroupUserListMemcache(model.getGroup());

        return model;
    }

    /**
     * PUT
     * @param email
     * @param userId
     * @param displayName
     * @param userImage
     * @param tagline
     * @param braggingRights
     * @param accessToken
     * @param refreshToken
     * @return
     */
    public static UserModel put(
            String userId,
            String email,
            String url,
            String displayName,
            Image userImage,
            String tagline,
            String braggingRights,
            String aboutMe,
            Cover cover,
            String accessToken,
            String refreshToken) {

        UserModel userModel = new UserModel();

        Key key = createKey(userId);

        userModel.setKey(key);

        // email
        if(email != null && !email.isEmpty()) {
            userModel.setEmail(email);
        }

        // url
        if(url != null && !url.isEmpty()) {
            userModel.setUrl(new Text(url));
        }

        // 表示名
        if(displayName != null && !displayName.isEmpty()) {
            userModel.setDisplayName(displayName);
        }

        // 写真
        if(userImage != null && !userImage.isEmpty()) {
            userModel.setImageUrl(new Text(userImage.getUrl()));
        }

        // キャッチ
        if(tagline != null && !tagline.isEmpty()) {
            userModel.setTagline(new Text(tagline));
        }

        // 特技
        if(braggingRights != null && !braggingRights.isEmpty()) {
            userModel.setBraggingRights(new Text(braggingRights));
        }

        // About Me
        if(aboutMe != null && !aboutMe.isEmpty()) {
            userModel.setAboutMe(new Text(aboutMe));
        }

        // 背景画像url
        if(cover != null && cover.getCoverPhoto() != null && cover.getCoverPhoto().getUrl() != null && !cover.getCoverPhoto().getUrl().isEmpty()) {
            userModel.setCoverPhotoUrl(new Text(cover.getCoverPhoto().getUrl()));
        }

        // アクセストークン
        if(userImage != null && !accessToken.isEmpty()) {
            userModel.setAccessToken(accessToken);
        }

        // リフレッシュトークン
        if(refreshToken != null && !refreshToken.isEmpty()) {
            userModel.setRefreshToken(refreshToken);
        }

        // 新しいユーザーをまず(0〜9)グループに割り当てる
        Random rnd = new Random();
        userModel.setGroup(rnd.nextInt(10));

        // チェック日を設定
        userModel.setUpdateCheckDate(new Date());

        return put(userModel);
    }

    private static Key createKey(String userID) {
        return Datastore.createKey(UserModelMeta.get(), userID);
    }

    /**
     * Delete
     * @param model
     * @return
     */
    public static void delete(UserModel userModel) {

        // ユーザーのすべてのDateModelを取得
        List<DateModel> dateModelList = userModel.getDateModelListRef().getModelList();

        for(DateModel dateModel: dateModelList) {
            // DateModelに紐づくつべてのActivityModel を取得
            List<ActivityModel> activityModelList = dateModel.getActivityModelListRef().getModelList();

            for(ActivityModel activityModel: activityModelList) {
                // アクティビティの削除
                ActivityService.delete(userModel, activityModel);
            }

            // DateModelの削除
            DateService.delete(userModel, dateModel);
        }

        // URLリストの削除
        UserUrlsService.deleteAll(userModel);

        userModelDao.delete(userModel.getKey());

        // 自信のキャッシュをクリア
        Memcache.delete(userModel.getKey().toString());

        // ユーザーカウントのキャッシュクリア
        clearUserCountAndListMemcache();
        // グループのキャッシュをクリア
        clearGroupUserListMemcache(userModel.getGroup());
    }

    /**
     * ユーザー数のキャッシュをクリア
     */
    public static void clearUserCountAndListMemcache() {
        Memcache.delete(SERVICE_USER_COUNT);
        Memcache.delete(ALL_USER_LIST);
//        Memcache.delete(EXAMPLE_USER_LIST);
    }

    /**
     * グループユーザーリストキャッシュキーの取得
     */
    public static String getGroupUserListMemcache(int groupId) {

        return GROUP_USER_LIST + "_" + groupId;
    }

    /**
     * グループユーザーリストのキャッシュをクリア
     */
    public static void clearGroupUserListMemcache(int groupId) {
        Memcache.delete(getGroupUserListMemcache(groupId));
    }

}
TOP

Related Classes of com.appspot.plucial.service.UserService

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.