notifications for project update & member invite

This commit is contained in:
Jake Potrebic 2020-08-10 19:53:01 -07:00
parent 6608bb8339
commit be761df36f
No known key found for this signature in database
GPG Key ID: 7C58557EC9C421F8
4 changed files with 35 additions and 21 deletions

View File

@ -11,6 +11,7 @@ import me.minidigger.hangar.db.model.UsersTable;
import me.minidigger.hangar.model.Category;
import me.minidigger.hangar.model.FlagReason;
import me.minidigger.hangar.model.NamedPermission;
import me.minidigger.hangar.model.NotificationType;
import me.minidigger.hangar.model.Permission;
import me.minidigger.hangar.model.Role;
import me.minidigger.hangar.model.Visibility;
@ -20,6 +21,7 @@ import me.minidigger.hangar.model.viewhelpers.ScopedProjectData;
import me.minidigger.hangar.model.viewhelpers.UserData;
import me.minidigger.hangar.security.annotations.GlobalPermission;
import me.minidigger.hangar.security.annotations.ProjectPermission;
import me.minidigger.hangar.service.NotificationService;
import me.minidigger.hangar.service.OrgService;
import me.minidigger.hangar.service.RoleService;
import me.minidigger.hangar.service.UserActionLogService;
@ -85,6 +87,7 @@ public class ProjectsController extends HangarController {
private final ProjectFactory projectFactory;
private final PagesSerivce pagesSerivce;
private final RoleService roleService;
private final NotificationService notificationService;
private final UserActionLogService userActionLogService;
private final ProjectFiles projectFiles;
private final TemplateHelper templateHelper;
@ -94,7 +97,7 @@ public class ProjectsController extends HangarController {
private final HttpServletRequest request;
@Autowired
public ProjectsController(HangarConfig hangarConfig, RouteHelper routeHelper, UserService userService, OrgService orgService, FlagService flagService, ProjectService projectService, ProjectFactory projectFactory, PagesSerivce pagesSerivce, RoleService roleService, UserActionLogService userActionLogService, ProjectFiles projectFiles, TemplateHelper templateHelper, HangarDao<UserDao> userDao, HangarDao<ProjectDao> projectDao, HttpServletRequest request) {
public ProjectsController(HangarConfig hangarConfig, RouteHelper routeHelper, UserService userService, OrgService orgService, FlagService flagService, ProjectService projectService, ProjectFactory projectFactory, PagesSerivce pagesSerivce, RoleService roleService, NotificationService notificationService, UserActionLogService userActionLogService, ProjectFiles projectFiles, TemplateHelper templateHelper, HangarDao<UserDao> userDao, HangarDao<ProjectDao> projectDao, HttpServletRequest request) {
this.hangarConfig = hangarConfig;
this.routeHelper = routeHelper;
this.userService = userService;
@ -104,6 +107,7 @@ public class ProjectsController extends HangarController {
this.projectFactory = projectFactory;
this.pagesSerivce = pagesSerivce;
this.roleService = roleService;
this.notificationService = notificationService;
this.userActionLogService = userActionLogService;
this.projectFiles = projectFiles;
this.templateHelper = templateHelper;
@ -424,10 +428,11 @@ public class ProjectsController extends HangarController {
}
}
// TODO perhaps bulk notification insert?
if (users != null && roles != null) {
for (int i = 0; i < users.size(); i++) {
roleService.addRole(projectsTable, users.get(i), roles.get(i), false);
// TODO notifications
notificationService.sendNotification(users.get(i), projectsTable.getOwnerId(), NotificationType.PROJECT_INVITE, new String[] { "notification.project.invite", roles.get(i).getTitle(), projectsTable.getName()});
}
}

View File

@ -1,14 +1,5 @@
package me.minidigger.hangar.service;
import org.postgresql.shaded.com.ongres.scram.common.util.Preconditions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import me.minidigger.hangar.db.dao.HangarDao;
import me.minidigger.hangar.db.dao.NotificationsDao;
import me.minidigger.hangar.db.dao.UserOrganizationRolesDao;
@ -16,16 +7,22 @@ import me.minidigger.hangar.db.dao.UserProjectRolesDao;
import me.minidigger.hangar.db.model.NotificationsTable;
import me.minidigger.hangar.db.model.OrganizationsTable;
import me.minidigger.hangar.db.model.ProjectsTable;
import me.minidigger.hangar.db.model.RoleTable;
import me.minidigger.hangar.db.model.UserOrganizationRolesTable;
import me.minidigger.hangar.db.model.UserProjectRolesTable;
import me.minidigger.hangar.db.model.Visitable;
import me.minidigger.hangar.model.InviteFilter;
import me.minidigger.hangar.model.NotificationFilter;
import me.minidigger.hangar.model.NotificationType;
import me.minidigger.hangar.model.viewhelpers.InviteSubject;
import me.minidigger.hangar.model.viewhelpers.UserData;
import me.minidigger.hangar.model.viewhelpers.UserRole;
import org.postgresql.shaded.com.ongres.scram.common.util.Preconditions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
@Service
public class NotificationService {
@ -44,8 +41,12 @@ public class NotificationService {
}
public NotificationsTable sendNotification(long userId, long originId, NotificationType type, String[] messageArgs) {
return sendNotification(userId, originId, type, messageArgs, null);
}
public NotificationsTable sendNotification(long userId, long originId, NotificationType type, String[] messageArgs, String action) {
Preconditions.checkArgument(messageArgs.length != 0, "messageArgs must be non-empty");
NotificationsTable notification = new NotificationsTable(userId, type, null, originId, messageArgs);
NotificationsTable notification = new NotificationsTable(userId, type, action, originId, messageArgs);
notificationsDao.get().insert(notification);
return notification;
}

View File

@ -2,15 +2,16 @@ package me.minidigger.hangar.service.project;
import me.minidigger.hangar.db.customtypes.LoggedActionType;
import me.minidigger.hangar.db.customtypes.LoggedActionType.ProjectContext;
import me.minidigger.hangar.db.customtypes.LoggedActionType.VersionContext;
import me.minidigger.hangar.db.dao.ProjectPageDao;
import me.minidigger.hangar.db.dao.ProjectVersionDao;
import me.minidigger.hangar.db.model.ProjectPagesTable;
import me.minidigger.hangar.db.model.ProjectVersionsTable;
import me.minidigger.hangar.model.NotificationType;
import me.minidigger.hangar.model.Platform;
import me.minidigger.hangar.model.generated.Dependency;
import me.minidigger.hangar.model.viewhelpers.ProjectPage;
import me.minidigger.hangar.model.viewhelpers.VersionData;
import me.minidigger.hangar.service.NotificationService;
import me.minidigger.hangar.service.UserActionLogService;
import me.minidigger.hangar.service.VersionService;
import me.minidigger.hangar.service.plugindata.PluginFileWithData;
@ -43,7 +44,6 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@ -55,22 +55,21 @@ public class ProjectFactory {
private final HangarDao<ProjectChannelDao> projectChannelDao;
private final HangarDao<ProjectDao> projectDao;
private final HangarDao<ProjectPageDao> projectPagesDao;
private final HangarDao<VisibilityDao> visibilityDao;
private final HangarDao<ProjectVersionDao> projectVersionDao;
private final RoleService roleService;
private final UserService userService;
private final ProjectService projectService;
private final ChannelService channelService;
private final VersionService versionService;
private final NotificationService notificationService;
private final UserActionLogService userActionLogService;
private final ProjectFiles projectFiles;
@Autowired
public ProjectFactory(HangarConfig hangarConfig, HangarDao<ProjectChannelDao> projectChannelDao, HangarDao<ProjectDao> projectDao, HangarDao<ProjectPageDao> projectPagesDao, HangarDao<VisibilityDao> visibilityDao, HangarDao<ProjectVersionDao> projectVersionDao, RoleService roleService, UserService userService, ProjectService projectService, ChannelService channelService, VersionService versionService, UserActionLogService userActionLogService, ProjectFiles projectFiles) {
public ProjectFactory(HangarConfig hangarConfig, HangarDao<ProjectChannelDao> projectChannelDao, HangarDao<ProjectDao> projectDao, HangarDao<ProjectPageDao> projectPagesDao, HangarDao<ProjectVersionDao> projectVersionDao, RoleService roleService, UserService userService, ProjectService projectService, ChannelService channelService, VersionService versionService, NotificationService notificationService, UserActionLogService userActionLogService, ProjectFiles projectFiles) {
this.hangarConfig = hangarConfig;
this.projectChannelDao = projectChannelDao;
this.projectDao = projectDao;
this.visibilityDao = visibilityDao;
this.projectVersionDao = projectVersionDao;
this.roleService = roleService;
this.userService = userService;
@ -78,6 +77,7 @@ public class ProjectFactory {
this.projectService = projectService;
this.channelService = channelService;
this.versionService = versionService;
this.notificationService = notificationService;
this.userActionLogService = userActionLogService;
this.projectFiles = projectFiles;
}
@ -173,7 +173,15 @@ public class ProjectFactory {
pendingVersion.getPlugin().getData().createTags(version.getId(), versionService); // TODO not sure what this is for
Platform.createPlatformTags(versionService, version.getId(), Dependency.from(version.getDependencies()));
// TODO notify watchers
List<UsersTable> watchers = projectService.getProjectWatchers(project.getProject().getId(), 0, null);
// TODO bulk notif insert
watchers.forEach(watcher -> notificationService.sendNotification(
watcher.getId(),
project.getProject().getOwnerId(),
NotificationType.NEW_PROJECT_VERSION,
new String[]{"notification.project.newVersion", project.getProject().getName(), version.getVersionString()},
project.getNamespace() + "/versions/" + version.getVersionString()
));
try {
uploadPlugin(project, pendingVersion.getPlugin(), version);
} catch (IOException e) {

View File

@ -144,7 +144,7 @@ public class ProjectService {
projectDao.get().update(project);
}
public List<UsersTable> getProjectWatchers(long projectId, int offset, int limit) {
public List<UsersTable> getProjectWatchers(long projectId, int offset, Integer limit) {
return userDao.get().getProjectWatchers(projectId, offset, limit);
}