package service;
import api.v1.Recipient;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.Query;
import com.avaje.ebean.RawSql;
import com.avaje.ebean.RawSqlBuilder;
import exceptions.PoseidonException;
import mapper.RecipientMapper;
import models.RecipientModel;
import play.mvc.Http;
import validators.RecipientValidator;
import validators.ValidationResult;
import java.util.Date;
import java.util.List;
public class RecipientService extends PoseidonService {
public RecipientService(String username) {
super(username);
}
public List<RecipientModel> findAll() {
return RecipientModel.find.all();
}
public RecipientModel getById(long id) {
return RecipientModel.find.byId(id);
}
public RecipientModel findByEmail(String email) {
return RecipientModel.find.where().ieq("email", email).findUnique();
}
public RecipientModel createOrUpdate(Recipient apiRecipient) {
RecipientModel mRecipient;
if ((apiRecipient.id != null) && (apiRecipient.id > 0)) {
mRecipient = updateExisting(apiRecipient);
} else {
RecipientModel p = findByEmail(apiRecipient.email);
if (p != null) {
throw new PoseidonException(Http.Status.BAD_REQUEST, "Posisjonens navn er ikke unikt");
}
mRecipient = new RecipientMapper().mapToModel(apiRecipient, getUser());
mRecipient.created = PoseidonService.getNow().toDate();
mRecipient.createdBy = getUser();
}
ValidationResult validationResult = new RecipientValidator().validateModel(mRecipient);
if (!validationResult.ok){
throw new PoseidonException(Http.Status.BAD_REQUEST,"Validering av epost-adresse feilet: " + validationResult.getMessage());
}
mRecipient.save();
return mRecipient;
}
private RecipientModel updateExisting(Recipient aRecipient) {
RecipientModel mRecipient = getById(aRecipient.id);
mRecipient.email = aRecipient.email;
mRecipient.updated = PoseidonService.getNow().toDate();
mRecipient.updatedBy = getUser();
return mRecipient;
}
public List<RecipientModel> getRecipientsForCustomer(Long id) {
String recipientsSql =
"select distinct r.id, r.email " +
" from pos_recipient r, pos_order o , POS_ORDER_RECIPIENTS pr, pos_customer c " +
" where r.id = pr.recipient_id" +
" and pr.order_id = o.id" +
" and o.customer_id = c.id ";
RawSql rawSql = RawSqlBuilder.parse(recipientsSql).
columnMapping("r.id", "id")
.columnMapping("r.email", "email")
.create();
Query<RecipientModel> query = Ebean.find(RecipientModel.class);
query.setRawSql(rawSql)
.where().eq("c.id", id);
List<RecipientModel> recipients = query.findList();
return recipients;
}
}