package gov.nysenate.openleg.controller.ui;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import gov.nysenate.openleg.dao.base.LimitOffset;
import gov.nysenate.openleg.dao.base.SortOrder;
import gov.nysenate.openleg.model.entity.Chamber;
import gov.nysenate.openleg.model.entity.Member;
import gov.nysenate.openleg.model.entity.SessionMember;
import gov.nysenate.openleg.service.entity.member.data.MemberService;
import gov.nysenate.openleg.service.entity.member.event.BulkMemberUpdateEvent;
import gov.nysenate.openleg.service.entity.member.event.MemberUpdateEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.stream.Collectors;
/**
* Common base class for all controllers that are responsible for rending content pages.
*/
public abstract class BaseContentPageCtrl
{
private static final Logger logger = LoggerFactory.getLogger(BaseContentPageCtrl.class);
@Autowired private MemberService memberData;
@Autowired private EventBus eventBus;
protected static List<Member> senatorsList = null;
protected static List<Member> assemblyMemList = null;
protected void baseInit() {
initializeMembers();
eventBus.register(this);
}
/**
* Adds common content request attributes. This is needed for things like senator drop downs
* which would otherwise require additional API calls.
*
* @param request HttpServletRequest
*/
protected void addContentAttributesToRequest(HttpServletRequest request) {
request.setAttribute("senatorList", senatorsList);
request.setAttribute("assemblyMemList", assemblyMemList);
}
/**
* Initializes the members list for use in drop downs in non-member centric pages. This data could be retrieved
* by an API call but it seems overkill to have to make a separate API call just for this listing which is fairly
* static..
*/
private void initializeMembers() {
List<Member> allMembers = memberData.getAllMembers(SortOrder.ASC, LimitOffset.ALL).stream()
.map(m -> new Member(m))
.distinct()
.collect(Collectors.toList());
senatorsList = allMembers.stream()
.filter(m -> m.getChamber().equals(Chamber.SENATE))
.collect(Collectors.toList());
assemblyMemList = allMembers.stream()
.filter(m -> m.getChamber().equals(Chamber.ASSEMBLY))
.collect(Collectors.toList());
}
@Subscribe
protected void handleMemberUpdate(MemberUpdateEvent event) {
initializeMembers();
}
@Subscribe
protected void handleMemberUpdate(BulkMemberUpdateEvent event) {
initializeMembers();
}
}