/*
This file is part of Cyclos (www.cyclos.org).
A project of the Social Trade Organisation (www.socialtrade.org).
Cyclos is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Cyclos is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Cyclos; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package nl.strohalm.cyclos.services.accounts.cards;
import java.util.Collection;
import java.util.List;
import nl.strohalm.cyclos.access.AdminMemberPermission;
import nl.strohalm.cyclos.access.BrokerPermission;
import nl.strohalm.cyclos.access.MemberPermission;
import nl.strohalm.cyclos.entities.Relationship;
import nl.strohalm.cyclos.entities.accounts.cards.Card;
import nl.strohalm.cyclos.entities.accounts.cards.CardQuery;
import nl.strohalm.cyclos.entities.groups.Group;
import nl.strohalm.cyclos.entities.members.FullTextMemberQuery;
import nl.strohalm.cyclos.entities.members.Member;
import nl.strohalm.cyclos.services.BaseServiceSecurity;
import nl.strohalm.cyclos.services.elements.BulkMemberActionResultVO;
import nl.strohalm.cyclos.utils.access.LoggedUser;
import nl.strohalm.cyclos.utils.access.PermissionHelper;
/**
* Security implementation for {@link CardService}
*
* @author Rinke
*/
public class CardServiceSecurity extends BaseServiceSecurity implements CardService {
private CardServiceLocal cardService;
@Override
public Card activateCard(Card card, final String cardCode) {
card = fetchService.fetch(card, Card.Relationships.OWNER);
permissionService.permission(card.getOwner())
.admin(AdminMemberPermission.CARDS_UNBLOCK)
.broker(BrokerPermission.CARDS_UNBLOCK)
.member(MemberPermission.CARDS_UNBLOCK)
.check();
return cardService.activateCard(card, cardCode);
}
@Override
public Card blockCard(Card card) {
card = fetchService.fetch(card, Card.Relationships.OWNER);
permissionService.permission(card.getOwner())
.admin(AdminMemberPermission.CARDS_BLOCK)
.broker(BrokerPermission.CARDS_BLOCK)
.member(MemberPermission.CARDS_BLOCK)
.check();
return cardService.blockCard(card);
}
@Override
@SuppressWarnings("unchecked")
public BulkMemberActionResultVO bulkGenerateNewCard(final FullTextMemberQuery query, final boolean generateForPending, final boolean generateForActive) {
if (query.getBroker() != null) {
permissionService.checkRelatesTo(query.getBroker());
}
Collection<Group> queryGroups = (Collection<Group>) query.getGroups();
query.setGroups(PermissionHelper.checkSelection(permissionService.getAllVisibleGroups(), queryGroups));
permissionService.permission().admin(AdminMemberPermission.BULK_ACTIONS_GENERATE_CARD).check();
return cardService.bulkGenerateNewCard(query, generateForPending, generateForActive);
}
@Override
public Card cancelCard(Card card) {
card = fetchService.fetch(card, Card.Relationships.OWNER);
permissionService.permission(card.getOwner())
.admin(AdminMemberPermission.CARDS_CANCEL)
.broker(BrokerPermission.CARDS_CANCEL)
.check();
return cardService.cancelCard(card);
}
@Override
public Card changeCardCode(Card card, final String code) {
card = fetchService.fetch(card, Card.Relationships.OWNER);
permissionService.permission(card.getOwner())
.admin(AdminMemberPermission.CARDS_CHANGE_CARD_SECURITY_CODE)
.broker(BrokerPermission.CARDS_CHANGE_CARD_SECURITY_CODE)
.member(MemberPermission.CARDS_CHANGE_CARD_SECURITY_CODE)
.check();
return cardService.changeCardCode(card, code);
}
@Override
public Card generateNewCard(final Member member) {
permissionService.permission(member)
.admin(AdminMemberPermission.CARDS_GENERATE)
.broker(BrokerPermission.CARDS_GENERATE)
.check();
return cardService.generateNewCard(member);
}
@Override
public Card getActiveCard(final Member member) {
checkView(member);
return cardService.getActiveCard(member);
}
@Override
public Card load(final long cardId, final Relationship... fetch) {
Relationship[] newFetch = addToFetch(fetch, Card.Relationships.OWNER);
Card card = cardService.load(cardId, newFetch);
checkView(card.getOwner());
return card;
}
@Override
public List<Card> search(final CardQuery query) {
Member member = query.getMember();
if (member == null) {
// No specific member - We can handle admins or brokers
permissionService.permission()
.admin(AdminMemberPermission.CARDS_VIEW)
.broker(BrokerPermission.CARDS_VIEW)
.check();
if (LoggedUser.isBroker()) {
query.setBroker(LoggedUser.member());
} else if (LoggedUser.isAdministrator()) {
query.setGroups(permissionService.getVisibleMemberGroups());
}
} else {
checkView(member);
}
return cardService.search(query);
}
public void setCardServiceLocal(final CardServiceLocal cardService) {
this.cardService = cardService;
}
@Override
public Card unblockCard(Card card) {
card = fetchService.fetch(card, Card.Relationships.OWNER);
permissionService.permission(card.getOwner())
.admin(AdminMemberPermission.CARDS_UNBLOCK)
.broker(BrokerPermission.CARDS_UNBLOCK)
.member(MemberPermission.CARDS_UNBLOCK)
.check();
return cardService.unblockCard(card);
}
@Override
public void unblockSecurityCode(Card card) {
card = fetchService.fetch(card, Card.Relationships.OWNER);
permissionService.permission(card.getOwner())
.admin(AdminMemberPermission.CARDS_UNBLOCK_SECURITY_CODE)
.broker(BrokerPermission.CARDS_UNBLOCK_SECURITY_CODE)
.check();
cardService.unblockSecurityCode(card);
}
private void checkView(final Member member) {
permissionService.permission(member)
.admin(AdminMemberPermission.CARDS_VIEW)
.broker(BrokerPermission.CARDS_VIEW)
.member(MemberPermission.CARDS_VIEW)
.check();
}
}