Use model instead of attributes to store Notification options

This commit is contained in:
Abyss777
2016-12-04 17:33:17 +07:00
parent c9232000e5
commit 6bfda86daa
6 changed files with 86 additions and 8 deletions

37
schema/changelog-3.9.xml Normal file
View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd"
logicalFilePath="changelog-3.9">
<changeSet author="author" id="changelog-3.9">
<addColumn tableName="notifications">
<column name="web" type="BOOLEAN" defaultValueBoolean="false" />
<column name="mail" type="BOOLEAN" defaultValueBoolean="false" />
</addColumn>
<update tableName="notifications">
<column name="web" valueBoolean="true" />
<where>attributes = '{"web":"true"}'</where>
</update>
<update tableName="notifications">
<column name="mail" valueBoolean="true" />
<where>attributes = '{"mail":"true"}'</where>
</update>
<update tableName="notifications">
<column name="web" valueBoolean="true" />
<column name="mail" valueBoolean="true" />
<where>attributes = '{"web":"true","mail":"true"}'</where>
</update>
<update tableName="notifications">
<column name="attributes" value="{}" />
</update>
</changeSet>
</databaseChangeLog>

View File

@@ -10,4 +10,5 @@
<include file="changelog-3.6.xml" relativeToChangelogFile="true" />
<include file="changelog-3.7.xml" relativeToChangelogFile="true" />
<include file="changelog-3.8.xml" relativeToChangelogFile="true" />
<include file="changelog-3.9.xml" relativeToChangelogFile="true" />
</databaseChangeLog>

View File

@@ -264,14 +264,16 @@
</entry>
<entry key='database.insertNotification'>
INSERT INTO notifications (userId, type, attributes)
VALUES (:userId, :type, :attributes)
INSERT INTO notifications (userId, type, web, mail, attributes)
VALUES (:userId, :type, :web, :mail, :attributes)
</entry>
<entry key='database.updateNotification'>
UPDATE notifications SET
userId = :userId,
type = :type,
web = :web,
mail = :mail,
attributes = :attributes
WHERE id = :id
</entry>

View File

@@ -49,7 +49,7 @@ public class NotificationResource extends BaseResource {
userId = getUserId();
}
Context.getPermissionsManager().checkUser(getUserId(), userId);
return Context.getNotificationManager().getUserNotifications(userId);
return Context.getNotificationManager().getAllUserNotifications(userId);
}
@POST

View File

@@ -59,10 +59,10 @@ public class NotificationManager {
&& Context.getGeofenceManager().checkGeofence(userId, event.getGeofenceId())) {
Notification notification = getUserNotificationByType(userId, event.getType());
if (notification != null) {
if (notification.getAttributes().containsKey("web")) {
if (notification.getWeb()) {
Context.getConnectionManager().updateEvent(userId, event, position);
}
if (notification.getAttributes().containsKey("mail")) {
if (notification.getMail()) {
NotificationMail.sendMailAsync(userId, event, position);
}
}
@@ -130,8 +130,11 @@ public class NotificationManager {
public void updateNotification(Notification notification) {
Notification cachedNotification = getUserNotificationByType(notification.getUserId(), notification.getType());
if (cachedNotification != null) {
if (!cachedNotification.getAttributes().equals(notification.getAttributes())) {
if (notification.getAttributes().isEmpty()) {
if (cachedNotification.getWeb() != notification.getWeb()
|| cachedNotification.getMail() != notification.getMail()
|| !cachedNotification.getAttributes().equals(notification.getAttributes())) {
if (!notification.getWeb() && !notification.getMail()
&& notification.getAttributes().isEmpty()) {
try {
dataManager.removeNotification(cachedNotification);
} catch (SQLException error) {
@@ -146,6 +149,8 @@ public class NotificationManager {
} else {
notificationsLock.writeLock().lock();
try {
cachedNotification.setWeb(notification.getWeb());
cachedNotification.setMail(notification.getMail());
cachedNotification.setAttributes(notification.getAttributes());
} finally {
notificationsLock.writeLock().unlock();
@@ -159,7 +164,7 @@ public class NotificationManager {
} else {
notification.setId(cachedNotification.getId());
}
} else if (!notification.getAttributes().isEmpty()) {
} else if (notification.getWeb() || notification.getMail() || !notification.getAttributes().isEmpty()) {
try {
dataManager.addNotification(notification);
} catch (SQLException error) {
@@ -193,4 +198,16 @@ public class NotificationManager {
return notifications;
}
public Collection<Notification> getAllUserNotifications(long userId) {
Map<String, Notification> notifications = new HashMap<>();
for (Notification notification : getAllNotifications()) {
notification.setUserId(userId);
notifications.put(notification.getType(), notification);
}
for (Notification notification : getUserNotifications(userId)) {
notifications.put(notification.getType(), notification);
}
return notifications.values();
}
}

View File

@@ -37,4 +37,25 @@ public class Notification extends Extensible {
this.type = type;
}
private boolean web;
public boolean getWeb() {
return web;
}
public void setWeb(boolean web) {
this.web = web;
}
private boolean mail;
public boolean getMail() {
return mail;
}
public void setMail(boolean mail) {
this.mail = mail;
}
}