finished user admin page

This commit is contained in:
Jake Potrebic 2020-09-03 22:24:59 -07:00
parent b80a2b2323
commit c4efbbc67a
No known key found for this signature in database
GPG Key ID: 7C58557EC9C421F8
10 changed files with 83 additions and 51 deletions

View File

@ -1,6 +1,29 @@
package io.papermc.hangar.controller;
import io.papermc.hangar.db.customtypes.LoggedActionType;
import io.papermc.hangar.db.customtypes.LoggedActionType.ProjectContext;
import io.papermc.hangar.db.model.Stats;
import io.papermc.hangar.model.NamedPermission;
import io.papermc.hangar.model.Permission;
import io.papermc.hangar.model.Visibility;
import io.papermc.hangar.model.viewhelpers.Activity;
import io.papermc.hangar.model.viewhelpers.LoggedActionViewModel;
import io.papermc.hangar.model.viewhelpers.OrganizationData;
import io.papermc.hangar.model.viewhelpers.ProjectFlag;
import io.papermc.hangar.model.viewhelpers.ReviewQueueEntry;
import io.papermc.hangar.model.viewhelpers.UnhealthyProject;
import io.papermc.hangar.model.viewhelpers.UserData;
import io.papermc.hangar.security.annotations.GlobalPermission;
import io.papermc.hangar.service.JobService;
import io.papermc.hangar.service.OrgService;
import io.papermc.hangar.service.SitemapService;
import io.papermc.hangar.service.StatsService;
import io.papermc.hangar.service.UserActionLogService;
import io.papermc.hangar.service.UserService;
import io.papermc.hangar.service.VersionService;
import io.papermc.hangar.service.project.FlagService;
import io.papermc.hangar.service.project.ProjectService;
import io.papermc.hangar.util.AlertUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.format.annotation.DateTimeFormat;
@ -12,41 +35,18 @@ import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import io.papermc.hangar.db.customtypes.LoggedActionType;
import io.papermc.hangar.db.customtypes.LoggedActionType.ProjectContext;
import io.papermc.hangar.model.NamedPermission;
import io.papermc.hangar.model.Permission;
import io.papermc.hangar.model.Visibility;
import io.papermc.hangar.model.viewhelpers.Activity;
import io.papermc.hangar.model.viewhelpers.LoggedActionViewModel;
import io.papermc.hangar.model.viewhelpers.ProjectFlag;
import io.papermc.hangar.model.viewhelpers.ReviewQueueEntry;
import io.papermc.hangar.model.viewhelpers.UnhealthyProject;
import io.papermc.hangar.model.viewhelpers.UserData;
import io.papermc.hangar.security.annotations.GlobalPermission;
import io.papermc.hangar.service.JobService;
import io.papermc.hangar.service.SitemapService;
import io.papermc.hangar.service.UserActionLogService;
import io.papermc.hangar.service.UserService;
import io.papermc.hangar.service.VersionService;
import io.papermc.hangar.service.StatsService;
import io.papermc.hangar.service.project.FlagService;
import io.papermc.hangar.service.project.ProjectService;
import io.papermc.hangar.util.AlertUtil;
@Controller
public class ApplicationController extends HangarController {
@ -54,6 +54,7 @@ public class ApplicationController extends HangarController {
private final UserService userService;
private final ProjectService projectService;
private final FlagService flagService;
private final OrgService orgService;
private final UserActionLogService userActionLogService;
private final VersionService versionService;
private final JobService jobService;
@ -63,9 +64,10 @@ public class ApplicationController extends HangarController {
private final HttpServletRequest request;
@Autowired
public ApplicationController(UserService userService, ProjectService projectService, VersionService versionService, FlagService flagService, UserActionLogService userActionLogService, JobService jobService, SitemapService sitemapService, StatsService statsService, HttpServletRequest request) {
public ApplicationController(UserService userService, ProjectService projectService, OrgService orgService, VersionService versionService, FlagService flagService, UserActionLogService userActionLogService, JobService jobService, SitemapService sitemapService, StatsService statsService, HttpServletRequest request) {
this.userService = userService;
this.projectService = projectService;
this.orgService = orgService;
this.flagService = flagService;
this.userActionLogService = userActionLogService;
this.versionService = versionService;
@ -218,7 +220,8 @@ public class ApplicationController extends HangarController {
ModelAndView mav = new ModelAndView("users/admin/userAdmin");
UserData userData = userService.getUserData(user);
mav.addObject("u", userData);
// TODO organization
OrganizationData organizationData = orgService.getOrganizationData(userData.getUser());
mav.addObject("orga", organizationData);
mav.addObject("userProjectRoles", projectService.getProjectsAndRoles(userData.getUser().getId()));
return fillModel(mav);
}

View File

@ -224,7 +224,7 @@ public class UsersController extends HangarController {
OrganizationsTable organizationsTable = orgService.getOrganization(user);
mav.addObject("u", userService.getUserData(user));
if (organizationsTable != null) {
mav.addObject("o", orgService.getOrganizationData(organizationsTable));
mav.addObject("o", orgService.getOrganizationData(organizationsTable, null));
mav.addObject("so", orgService.getScopedOrganizationData(organizationsTable));
}
return fillModel(mav);

View File

@ -13,11 +13,13 @@ public class JoinableData<R extends RoleTable, T> {
protected T joinable;
protected long ownerId;
protected String ownerName;
protected Map<R, UsersTable> members;
protected RoleCategory roleCategory;
public JoinableData(T joinable, long ownerId, Map<R, UsersTable> members, RoleCategory roleCategory) {
public JoinableData(T joinable, long ownerId, String ownerName, Map<R, UsersTable> members, RoleCategory roleCategory) {
this.joinable = joinable;
this.ownerName = ownerName;
this.ownerId = ownerId;
this.members = members;
this.roleCategory = roleCategory;
@ -27,6 +29,14 @@ public class JoinableData<R extends RoleTable, T> {
return joinable;
}
public long getOwnerId() {
return ownerId;
}
public String getOwnerName() {
return ownerName;
}
public Map<R, UsersTable> getMembers() {
return members;
}

View File

@ -8,13 +8,15 @@ import io.papermc.hangar.db.model.UserProjectRolesTable;
import io.papermc.hangar.db.model.UsersTable;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
public class OrganizationData extends JoinableData<UserOrganizationRolesTable, OrganizationsTable> {
private final Map<UserProjectRolesTable, ProjectsTable> projectRoles;
public OrganizationData(OrganizationsTable org, Map<UserOrganizationRolesTable, UsersTable> members, Map<UserProjectRolesTable, ProjectsTable> projectRoles) {
super(org, org.getOwnerId(), members, RoleCategory.ORGANIZATION);
public OrganizationData(OrganizationsTable org, UsersTable orgUser, Map<UserOrganizationRolesTable, UsersTable> members, Map<UserProjectRolesTable, ProjectsTable> projectRoles) {
super(org, org.getOwnerId(), orgUser.getName(), members, RoleCategory.ORGANIZATION);
this.projectRoles = projectRoles;
}
@ -22,6 +24,10 @@ public class OrganizationData extends JoinableData<UserOrganizationRolesTable, O
return this.joinable;
}
public Map<UsersTable, UserRole<UserOrganizationRolesTable>> adminTable() {
return getMembers().entrySet().stream().collect(Collectors.toMap(Entry::getValue, entry -> new UserRole<>(entry.getKey())));
}
public Map<UserProjectRolesTable, ProjectsTable> getProjectRoles() {
return projectRoles;
}

View File

@ -29,7 +29,7 @@ public class ProjectData extends JoinableData<UserProjectRolesTable, ProjectsTab
public ProjectData(ProjectsTable joinable, UsersTable projectOwner, int publicVersions, Map<UserProjectRolesTable, UsersTable> members, List<ProjectFlag> flags, int noteCount, ProjectVisibilityChangesTable lastVisibilityChange, String lastVisibilityChangeUser, ProjectVersionsTable recommendedVersion, String iconUrl, long starCount, long watcherCount, ProjectViewSettings settings) {
super(joinable, projectOwner.getId(), members, RoleCategory.PROJECT);
super(joinable, projectOwner.getId(), projectOwner.getName(), members, RoleCategory.PROJECT);
this.projectOwner = projectOwner;
this.publicVersions = publicVersions;
this.flags = flags;

View File

@ -1,6 +1,5 @@
package io.papermc.hangar.model.viewhelpers;
import io.papermc.hangar.db.model.OrganizationsTable;
import io.papermc.hangar.db.model.UserOrganizationRolesTable;
import io.papermc.hangar.db.model.UsersTable;
import io.papermc.hangar.model.Permission;
@ -17,7 +16,7 @@ public class UserData {
private UsersTable user;
private boolean isOrga = false;
private int projectCount;
private Map<OrganizationsTable, UserRole<UserOrganizationRolesTable>> orgas;
private Map<OrganizationData, UserRole<UserOrganizationRolesTable>> orgas;
private List<Role> globalRoles;
private Permission userPerm;
private Permission orgaPerm;
@ -26,7 +25,7 @@ public class UserData {
return new UserData(headerData, user, false, 0, new HashMap<>(), new ArrayList<>(), Permission.None, Permission.None);
}
public UserData(HeaderData headerData, UsersTable user, boolean isOrga, int projectCount, Map<OrganizationsTable, UserRole<UserOrganizationRolesTable>> orgas, List<Role> globalRoles, Permission userPerm, Permission orgaPerm) {
public UserData(HeaderData headerData, UsersTable user, boolean isOrga, int projectCount, Map<OrganizationData, UserRole<UserOrganizationRolesTable>> orgas, List<Role> globalRoles, Permission userPerm, Permission orgaPerm) {
this.headerData = headerData;
this.user = user;
this.isOrga = isOrga;
@ -81,11 +80,11 @@ public class UserData {
this.projectCount = projectCount;
}
public Map<OrganizationsTable, UserRole<UserOrganizationRolesTable>> getOrgas() {
public Map<OrganizationData, UserRole<UserOrganizationRolesTable>> getOrgas() {
return orgas;
}
public void setOrgas(Map<OrganizationsTable, UserRole<UserOrganizationRolesTable>> orgas) {
public void setOrgas(Map<OrganizationData, UserRole<UserOrganizationRolesTable>> orgas) {
this.orgas = orgas;
}

View File

@ -14,6 +14,7 @@ import io.papermc.hangar.model.Permission;
import io.papermc.hangar.model.viewhelpers.OrgMember;
import io.papermc.hangar.model.viewhelpers.OrganizationData;
import io.papermc.hangar.model.viewhelpers.ScopedOrganizationData;
import org.jetbrains.annotations.Nullable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
@ -82,7 +83,17 @@ public class OrgService {
return new ScopedOrganizationData();
}
public OrganizationData getOrganizationData(OrganizationsTable org) {
return new OrganizationData(org, organizationDao.get().getOrgMembers(org.getId()), projectDao.get().getProjectRoles(org.getUserId()));
public OrganizationData getOrganizationData(UsersTable potentialOrg) {
OrganizationsTable org = organizationDao.get().getByUserId(potentialOrg.getId());
if (org == null) return null;
return getOrganizationData(org, potentialOrg);
}
public OrganizationData getOrganizationData(OrganizationsTable org, @Nullable UsersTable orgUser) {
UsersTable user = orgUser;
if (orgUser == null) {
user = userDao.get().getById(org.getUserId());
}
return new OrganizationData(org, user,organizationDao.get().getOrgMembers(org.getId()), projectDao.get().getProjectRoles(org.getUserId()));
}
}

View File

@ -17,6 +17,7 @@ import io.papermc.hangar.model.UserOrdering;
import io.papermc.hangar.model.viewhelpers.Author;
import io.papermc.hangar.model.viewhelpers.FlagActivity;
import io.papermc.hangar.model.viewhelpers.HeaderData;
import io.papermc.hangar.model.viewhelpers.OrganizationData;
import io.papermc.hangar.model.viewhelpers.ReviewActivity;
import io.papermc.hangar.model.viewhelpers.Staff;
import io.papermc.hangar.model.viewhelpers.UserData;
@ -46,10 +47,11 @@ public class UserService {
private final HangarDao<OrganizationDao> organizationDao;
private final RoleService roleService;
private final PermissionService permissionService;
private final OrgService orgService;
private final HangarConfig config;
@Autowired
public UserService(HangarDao<UserDao> userDao, HangarConfig config, HangarDao<OrganizationDao> orgDao, HangarDao<ProjectDao> projectDao, HangarDao<OrganizationDao> organizationDao, RoleService roleService, PermissionService permissionService) {
public UserService(HangarDao<UserDao> userDao, HangarConfig config, HangarDao<OrganizationDao> orgDao, HangarDao<ProjectDao> projectDao, HangarDao<OrganizationDao> organizationDao, RoleService roleService, PermissionService permissionService, OrgService orgService) {
this.userDao = userDao;
this.config = config;
this.orgDao = orgDao;
@ -57,6 +59,7 @@ public class UserService {
this.organizationDao = organizationDao;
this.roleService = roleService;
this.permissionService = permissionService;
this.orgService = orgService;
}
public UsersTable getCurrentUser() {
@ -163,9 +166,9 @@ public class UserService {
// TODO getUserData
int projectCount = projectDao.get().getProjectCountByUserId(user.getId());
Map<OrganizationsTable, UserOrganizationRolesTable> dbOrgs = orgDao.get().getUserOrganizationsAndRoles(user.getId());
Map<OrganizationsTable, UserRole<UserOrganizationRolesTable>> organizations = new HashMap<>();
Map<OrganizationData, UserRole<UserOrganizationRolesTable>> organizations = new HashMap<>();
dbOrgs.forEach((organization, userOrganizationRolesTable) -> {
organizations.put(organization, new UserRole<>(userOrganizationRolesTable));
organizations.put(orgService.getOrganizationData(organization, null), new UserRole<>(userOrganizationRolesTable));
});
List<Role> globalRoles = roleService.getGlobalRolesForUser(user.getId(), null);
boolean isOrga = globalRoles.contains(Role.ORGANIZATION);

View File

@ -41,17 +41,16 @@
<#if !u.isOrga()>
<@panel "Organizations">
<@roleTable keyName="Organization" tableType="orgRole" withOwner=true roles=u.orgas roleTypes=orgRoles ; org, role>
<#-- @ftlvariable name="org" type="io.papermc.hangar.db.model.OrganizationsTable" -->
<a href="${routes.getRouteUrl("userAdmin", org.name)}">
${org.name}
<#-- @ftlvariable name="org" type="io.papermc.hangar.model.viewhelpers.OrganizationData" -->
<a href="${routes.getRouteUrl("userAdmin", org.org.name)}">
${org.org.name}
</a>
</@roleTable>
</@panel>
<#else>
<@panel "Members">
TODO organization members map
<@roleTable keyName="User" tableType="memberRole" withOwner=false roles={} roleTypes=orgRoles ; member, role>
<#-- @ftlvariable name="member" type="io.papermc.hangar.model.viewhelpers.UserData" -->
<#-- TODO organization members map-->
<@roleTable keyName="User" tableType="memberRole" withOwner=false roles=orga.adminTable() roleTypes=orgRoles ; member, role>
<a href="${routes.getRouteUrl("userAdmin", member.user.name)}">
${member.user.name}
</a>
@ -97,7 +96,8 @@
<tr data-role-type="${tableType}" data-role-id="${role.role.roleId}">
<td><#nested object, role /></td>
<#if withOwner>
<td><a href="${routes.getRouteUrl("userAdmin", object.projectOwner.name)}">${object.projectOwner.name}</a></td>
<#-- @ftlvariable name="object" type="io.papermc.hangar.model.viewhelpers.JoinableData" -->
<td><a href="${routes.getRouteUrl("userAdmin", object.ownerName)}">${object.ownerName}</a></td>
</#if>
<#if !role.role.assignable>
<td>

View File

@ -77,9 +77,9 @@
<tr>
<td>
<#import "*/utils/userAvatar.ftlh" as userAvatar>
<@userAvatar.userAvatar userName=organization.name avatarUrl=utils.avatarUrl(organization.name) clazz="user-avatar-xxs"></@userAvatar.userAvatar>
<a href="${routes.getRouteUrl("users.showProjects", organization.name)}">
${organization.name}
<@userAvatar.userAvatar userName=organization.org.name avatarUrl=utils.avatarUrl(organization.org.name) clazz="user-avatar-xxs"></@userAvatar.userAvatar>
<a href="${routes.getRouteUrl("users.showProjects", organization.org.name)}">
${organization.org.name}
</a>
<div class="pull-right">
${role.role.title}