/** * Yobi, Project Hosting SW * * Copyright 2013 NAVER Corp. * http://yobi.io * * @author Keesun Baik * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package models; import models.enumeration.EventType; import play.db.ebean.Model; import javax.persistence.*; import java.util.HashMap; import java.util.List; import java.util.Map; /** * User this class when someone want to know whether a user is receiving notification alarm from the project or not * * @author Keesun Baik */ @Entity @Table(uniqueConstraints = @UniqueConstraint(columnNames = {"project_id", "user_id", "notification_type"})) public class UserProjectNotification extends Model { private static final long serialVersionUID = 1L; public static final Finder<Long, UserProjectNotification> find = new Finder<>(Long.class, UserProjectNotification.class); @Id public Long id; @ManyToOne public User user; @ManyToOne public Project project; @Enumerated(EnumType.STRING) public EventType notificationType; public boolean allowed; public static Map<Project, Map<EventType, Boolean>> getProjectNotifications(User user) { Map<Project, Map<EventType, Boolean>> result = new HashMap<>(); List<UserProjectNotification> list = find.where().eq("user", user).findList(); for(UserProjectNotification noti : list) { Project notiProject = noti.project; Map<EventType, Boolean> pn = result.get(notiProject); if(pn == null) { pn = new HashMap<>(); result.put(notiProject, pn); } pn.put(noti.notificationType, noti.allowed); } return result; } /** * Check whether the alarm which is respond to watching {@code project}'s {@code notiType} * is already being received or not. * * If there is no information about {@code project} in {@code notiMap} * or doesn't exist {@code project}'s {@code notiType}, * then the method judge that it is already receiving the notification alarm. * * @param notiMap * @param project * @param notiType * @return */ public static boolean isEnabledNotiType(Map<Project, Map<EventType, Boolean>> notiMap, Project project, EventType notiType) { if(!notiMap.containsKey(project)) { return true; } Map<EventType, Boolean> projectNoti = notiMap.get(project); if(!projectNoti.containsKey(notiType)) { return true; } else { return projectNoti.get(notiType); } } public static UserProjectNotification findOne(User user, Project project, EventType notificationType) { return find.where() .eq("user", user) .eq("project", project) .eq("notificationType", notificationType) .findUnique(); } public void toggle() { this.allowed = !this.allowed; update(); } public static void unwatchExplictly(User user, Project project, EventType notiType) { UserProjectNotification newOne = new UserProjectNotification(); newOne.user = user; newOne.project = project; newOne.notificationType = notiType; newOne.allowed = false; newOne.save(); } /** * * Basically, if there is no information about {@code project}' {@code notiType} * then it judge it is already receiving notification alarm. * * @param user * @param project * @param eventType * @return */ public static boolean isEnabledNotiType(User user, Project project, EventType eventType) { UserProjectNotification notification = findOne(user, project, eventType); return notification == null || notification.allowed; } }