package de.flower.rmt.service; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; import com.google.common.collect.Lists; import com.mysema.query.types.Path; import com.mysema.query.types.expr.BooleanExpression; import de.flower.common.ui.ajax.dragndrop.DraggableDto; import de.flower.common.util.Check; import de.flower.rmt.model.db.entity.Invitation; import de.flower.rmt.model.db.entity.Invitation_; import de.flower.rmt.model.db.entity.Lineup; import de.flower.rmt.model.db.entity.LineupItem; import de.flower.rmt.model.db.entity.QLineup; import de.flower.rmt.model.db.entity.QLineupItem; import de.flower.rmt.model.db.entity.event.Event; import de.flower.rmt.repository.ILineupItemRepo; import de.flower.rmt.repository.ILineupRepo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * @author flowerrrr */ @Service @Transactional(propagation = Propagation.REQUIRED) public class LineupManager extends AbstractService implements ILineupManager { @Autowired private ILineupRepo lineupRepo; @Autowired private ILineupItemRepo lineupItemRepo; @Autowired private IInvitationManager invitationManager; @Autowired private IActivityManager activityManager; @Override public Lineup findLineup(final Event event) { BooleanExpression isEvent = QLineup.lineup.event.eq(event); return lineupRepo.findOne(isEvent); } @Override public Lineup findOrCreateLineup(final Event event, Path<?>... attributes) { Lineup lineup = findLineup(event); if (lineup == null) { lineup = createLineup(event); } return lineup; } @Override public List<LineupItem> findLineupItems(final Event event, Path<?>... attributes) { Lineup lineup = findOrCreateLineup(event); BooleanExpression isEvent = QLineupItem.lineupItem.lineup.event.eq(event); List<LineupItem> items = lineupItemRepo.findAll(isEvent, attributes); for (int i = 0; i < attributes.length; i++) { if (attributes[i].equals(QLineupItem.lineupItem.invitation)) { // load invitations with users as we need them later. fetching user name via attributes is not possible // once loaded into session we avoid LIE invitationManager.findAllByEvent(event, Invitation_.user); } } return items; } @Override public List<Invitation> findInvitationsInLinuep(final Event event) { List<LineupItem> lineupItems = findLineupItems(event, QLineupItem.lineupItem.invitation); return Lists.transform(lineupItems, new Function<LineupItem, Invitation>() { @Override public Invitation apply(final LineupItem input) { return input.getInvitation(); } }); } @Override public Lineup createLineup(final Event event) { Lineup lineup = new Lineup(event); lineupRepo.save(lineup); return lineup; } @Override public void drop(final DraggableDto dto) { Invitation invitation = invitationManager.loadById(dto.entityId, Invitation_.event); Lineup lineup = findOrCreateLineup(invitation.getEvent()); Check.notNull(lineup); LineupItem item = lineupItemRepo.findByLineupAndInvitation(lineup, invitation); if (item == null) { item = new LineupItem(lineup, invitation); } // update positions item.setTop(dto.top); item.setLeft(dto.left); save(item); } @Override public void removeLineupItem(final Long invitationId) { Invitation invitation = invitationManager.loadById(invitationId); Lineup lineup = findLineup(invitation.getEvent()); if (lineup != null) { LineupItem item = lineupItemRepo.findByLineupAndInvitation(lineup, invitation); if (item != null) { lineupItemRepo.delete(item); } } } @VisibleForTesting @Override public void save(final LineupItem item) { validate(item); lineupItemRepo.save(item); } @Override public void delete(final Long lineupId) { lineupRepo.delete(lineupId); // delete is cascaded to lineupitems } @Override public void publishLineup(final Event event) { Lineup lineup = findOrCreateLineup(event); Check.notNull(lineup); lineup.setPublished(true); lineupRepo.save(lineup); activityManager.onLineupPublished(lineup); } }