mirror of
https://github.com/HangarMC/Hangar.git
synced 2025-03-31 16:00:39 +08:00
finished user admin page
This commit is contained in:
parent
b80a2b2323
commit
c4efbbc67a
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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()));
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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>
|
||||
|
@ -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}
|
||||
|
Loading…
x
Reference in New Issue
Block a user