package org.xcolab.client.members;
import org.xcolab.client.members.legacy.enums.MemberRole;
import org.xcolab.client.members.pojo.Member;
import org.xcolab.client.members.pojo.Role_;
import org.xcolab.util.clients.CoLabService;
import org.xcolab.util.http.ServiceRequestUtils;
import org.xcolab.util.http.caching.CacheName;
import org.xcolab.util.http.client.RestResource1;
import org.xcolab.util.http.client.RestResource2L;
import org.xcolab.util.http.client.RestService;
import org.xcolab.util.http.client.types.TypeProvider;
import java.util.List;
public final class PermissionsClient {
private static final RestService membersService = new RestService(CoLabService.MEMBER,
ServiceRequestUtils.getNamespace());
private static final RestResource1<Object, Long> roleGroupResource = new RestResource1<>(membersService,
"roleGroups", new TypeProvider<>(null, null));
private static final RestResource2L<Object, Role_> roleGroupRoleResource =
new RestResource2L<>(roleGroupResource, "roles", Role_.TYPES);
private PermissionsClient() {
}
public static boolean canAdminAll(Long memberId) {
return memberHasRole(memberId, MemberRole.ADMINISTRATOR.getRoleId());
}
public static boolean canAdminAll(Member member) {
return member != null && canAdminAll(member.getId_());
}
public static boolean canJudge(Long memberId, Long contestId) {
return memberHasRoleInContest(memberId, contestId, MemberRole.JUDGE);
}
public static boolean canFellow(Long memberId, Long contestId) {
return memberHasRoleInContest(memberId, contestId, MemberRole.FELLOW);
}
public static boolean canIAF(Long memberId) {
return memberHasRole(memberId, MemberRole.IMPACT_ASSESSMENT_FELLOW.getRoleId());
}
public static boolean canStaff(Long memberId) {
return memberHasRole(memberId, MemberRole.STAFF.getRoleId());
}
public static boolean hasRoleGroup(long memberId, long roleGroupId) {
final List<Role_> roles = getRoleGroupRoles(roleGroupId);
for (Role_ role : roles) {
if (memberHasRole(memberId, role.getRoleId())) {
return true;
}
}
return canAdminAll(memberId);
}
private static List<Role_> getRoleGroupRoles(long roleGroupId) {
//TODO: think about structure
return roleGroupRoleResource.resolveParent(roleGroupResource.id(roleGroupId))
.list()
.withCache(CacheName.CONFIGURATION)
.execute();
}
public static boolean memberHasRole(Long memberId, long roleIdToTest) {
if (memberId == 0) {
return false;
}
List<Role_> roles = MembersClient.getMemberRoles(memberId);
if (roles != null && !roles.isEmpty()) {
for (Role_ role : roles) {
if (role.getRoleId() == roleIdToTest) {
return true;
}
}
}
return false;
}
private static boolean memberHasRoleInContest(Long memberId, Long contestId, MemberRole roleToTest) {
if (memberId == 0) {
return false;
}
List<Role_> roles = MembersClient.getMemberRolesInContest(memberId, contestId);
if (roles != null && !roles.isEmpty()) {
for (Role_ role : roles) {
if (role.getRoleId() == roleToTest.getRoleId()) {
return true;
}
}
}
return false;
}
}