package org.karmaexchange.resources.msg;
import static org.karmaexchange.util.OfyService.ofy;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
import javax.xml.bind.annotation.XmlRootElement;
import org.karmaexchange.dao.AggregateRating;
import org.karmaexchange.dao.CauseType;
import org.karmaexchange.dao.KeyWrapper;
import org.karmaexchange.dao.Organization;
import org.karmaexchange.dao.Organization.Role;
import org.karmaexchange.dao.PageRef;
import org.karmaexchange.dao.User;
import org.karmaexchange.dao.User.OrganizationMembership;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.googlecode.objectify.Key;
import lombok.Data;
import lombok.NoArgsConstructor;
@XmlRootElement
@Data
@NoArgsConstructor
public class OrganizationMembershipView {
private KeyWrapper<Organization> org;
private String orgName;
private PageRef orgPage;
private long orgKarmaPoints;
private AggregateRating orgEventRating;
private List<CauseType> orgCauses;
private String searchTokenSuffix;
@Nullable
private Organization.Role role;
@Nullable
private Organization.Role requestedRole;
public static List<OrganizationMembershipView> create(User user, Role minRole) {
// The number of memberships a user should have is small. Therefore, fetch them all and
// then sort them.
Map<Key<Organization>, OrganizationMembership> membershipMap = Maps.newHashMap();
for (OrganizationMembership membership : user.getOrganizationMemberships()) {
if ((membership.getRole() != null) &&
membership.getRole().hasEqualOrMoreCapabilities(minRole)) {
membershipMap.put(KeyWrapper.toKey(membership.getOrganization()), membership);
}
}
List<Organization> organizations = Lists.newArrayList();
for (Organization org : ofy().load().keys(membershipMap.keySet()).values()) {
if (org != null) {
organizations.add(org);
}
}
Collections.sort(organizations, Organization.OrgNameComparator.INSTANCE);
List<OrganizationMembershipView> membershipViewList = Lists.newArrayList();
for (Organization org : organizations) {
membershipViewList.add(
new OrganizationMembershipView(org, membershipMap.get(Key.create(org))));
}
return membershipViewList;
}
private OrganizationMembershipView(Organization org, OrganizationMembership membership) {
this.org = KeyWrapper.create(org);
orgName = org.getOrgName();
orgPage = org.getPage();
orgKarmaPoints = org.getKarmaPoints();
orgEventRating = org.getEventRating();
orgCauses = org.getCauses();
role = membership.getRole();
requestedRole = membership.getRequestedRole();
searchTokenSuffix = org.getSearchTokenSuffix();
}
}