com.campodejazayeri.wedding.AdminController.java Source code

Java tutorial

Introduction

Here is the source code for com.campodejazayeri.wedding.AdminController.java

Source

/**
 * The contents of this file are subject to the OpenMRS Public License
 * Version 1.0 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://license.openmrs.org
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific language governing rights and limitations
 * under the License.
 *
 * Copyright (C) OpenMRS, LLC.  All Rights Reserved.
 */
package com.campodejazayeri.wedding;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import javax.mail.internet.MimeMessage;
import javax.servlet.http.HttpSession;

import org.ektorp.CouchDbConnector;
import org.ektorp.ViewQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.campodejazayeri.wedding.domain.InvitationGroup;
import com.campodejazayeri.wedding.domain.Invitee;

/**
 *
 */
@Controller
public class AdminController {

    @Autowired
    @Qualifier("couchdb")
    private CouchDbConnector db;

    @Autowired
    private JavaMailSender mailSender;

    List<String> events = Arrays.asList("attendingWednesday", "attendingThursday", "attendingFriday",
            "attendingCeremony", "attendingFiesta");

    @RequestMapping("/admin")
    public String admin(HttpSession session, @RequestParam(required = false, value = "password") String password,
            @RequestParam(required = false, value = "view") String groupId,
            @RequestParam(required = false, value = "item") String itemId, Model model) throws Exception {

        if (password != null)
            session.setAttribute("campodejazayeri-admin-password", password);
        if (!"PASSWORD".equals(session.getAttribute("campodejazayeri-admin-password"))) {
            return "admin-authenticate";
        }

        ViewQuery query = new ViewQuery().designDocId("_design/groups").viewName("groups").includeDocs(true);
        List<InvitationGroup> groups = db.queryView(query, InvitationGroup.class);
        model.addAttribute("groups", groups);

        List<String> attendees = new ArrayList<String>();
        List<String> notAttending = new ArrayList<String>();
        for (InvitationGroup g : groups) {
            for (Invitee inv : g.getAttending())
                attendees.add(g.getGroupName() + ": " + inv.getName());
            for (Invitee inv : g.getSaidNo())
                notAttending.add(g.getGroupName() + ": " + inv.getName());
        }
        model.addAttribute("numAttendees", attendees.size());
        model.addAttribute("attendees", attendees);
        model.addAttribute("numNotAttending", notAttending.size());
        model.addAttribute("notAttending", notAttending);

        List<String> attendingWednesday = new ArrayList<String>();
        List<String> attendingThursday = new ArrayList<String>();
        List<String> attendingFriday = new ArrayList<String>();
        List<String> attendingRehearsal = new ArrayList<String>();
        List<String> attendingCeremony = new ArrayList<String>();
        List<String> attendingFiesta = new ArrayList<String>();

        for (InvitationGroup g : groups) {
            for (Invitee i : g.getInvitees()) {
                if (test(i.getAttendingWednesday()))
                    attendingWednesday.add(format(g, i));
                if (test(i.getAttendingThursday()))
                    attendingThursday.add(format(g, i));
                if (test(i.getAttendingFriday()))
                    attendingFriday.add(format(g, i));
                if (test(i.getAttendingRehearsal()))
                    attendingRehearsal.add(format(g, i));
                if (test(i.getAttendingCeremony()))
                    attendingCeremony.add(format(g, i));
                if (test(i.getAttendingFiesta()))
                    attendingFiesta.add(format(g, i));
            }
        }

        model.addAttribute("attendingWednesday", attendingWednesday);
        model.addAttribute("attendingThursday", attendingThursday);
        model.addAttribute("attendingFriday", attendingFriday);
        model.addAttribute("attendingRehearsal", attendingRehearsal);
        model.addAttribute("attendingCeremony", attendingCeremony);
        model.addAttribute("attendingFiesta", attendingFiesta);

        List<String> englishGroups = new ArrayList<String>();
        List<String> spanishGroups = new ArrayList<String>();
        for (InvitationGroup g : groups) {
            if ("en".equals(g.getLanguage()) && g.getAttending().size() > 0) {
                englishGroups.add(g.getId() + " - " + g.getGroupName());
            } else if ("es".equals(g.getLanguage()) && g.getAttending().size() > 0) {
                spanishGroups.add(g.getId() + " - " + g.getGroupName());
            }
        }
        model.addAttribute("englishComing", englishGroups);
        model.addAttribute("spanishComing", spanishGroups);

        if (groupId != null) {
            InvitationGroup group = db.get(InvitationGroup.class, groupId);
            model.addAttribute("group", group);
        }

        return null;
    }

    /**
      * Auto generated method comment
      * 
      * @param g
      * @param i
      * @return
      */
    private String format(InvitationGroup g, Invitee i) {
        return "<span style=\"font-size: 0.5em\">" + g.getGroupName() + "</span> - " + i.getName();
    }

    /**
      * Auto generated method comment
      * 
      * @param attending
      * @return
      */
    private boolean test(Boolean attending) {
        return attending != null && attending;
    }

    @RequestMapping("/admin-add-group")
    public String addGroup(@ModelAttribute InvitationGroup group, @RequestParam("groupLanguage") String language) {
        if (StringUtils.hasText(group.getGroupName())) {
            group.setId(randomId());
            group.setLanguage(language);
            db.create(group);
        }
        return "redirect:admin";
    }

    private String randomId() {
        return "" + ((int) (Math.random() * 10000));
    }

    @RequestMapping("/admin-add-invitee")
    public String addInvitee(@RequestParam(required = false, value = "group") String groupId,
            @ModelAttribute Invitee invitee) {
        InvitationGroup group = db.get(InvitationGroup.class, groupId);
        group.addInvitee(invitee);
        db.update(group);
        return "redirect:admin?view=" + group.getId();
    }

    @RequestMapping("/bulk-invite")
    public String bulkInvite(@RequestParam("invitees") MultipartFile invitees) throws Exception {
        if (!invitees.isEmpty()) {
            Map<String, InvitationGroup> groupsByName = new HashMap<String, InvitationGroup>();
            ViewQuery query = new ViewQuery().designDocId("_design/groups").viewName("groups").includeDocs(true);
            for (InvitationGroup existing : db.queryView(query, InvitationGroup.class)) {
                groupsByName.put(standardizeName(existing.getGroupName()), existing);
            }

            BufferedReader r = new BufferedReader(new InputStreamReader(invitees.getInputStream()));
            for (String row = r.readLine(); row != null; row = r.readLine()) {
                String[] cells = row.split(",");
                if (cells[0].equals("Group Name"))
                    continue;
                if (!(StringUtils.hasText(cells[0]) && StringUtils.hasText(cells[1])
                        && StringUtils.hasText(cells[2])))
                    throw new RuntimeException("Malformed row: " + row);
                if (cells[0].startsWith("\"") && cells[0].endsWith("\""))
                    cells[0] = cells[0].substring(1, cells[0].length() - 1);
                InvitationGroup group = groupsByName.get(cells[0].trim());
                if (group == null) {
                    group = new InvitationGroup();
                    group.setGroupName(cells[0].trim());
                    throw new RuntimeException("Only updates now! Couldn't find " + cells[0]);
                }
                group.setEmail(cells[1].trim());
                group.setLanguage(cells[2].trim());
                group.setInvitedTours(StringUtils.hasText(cells[3]));
                group.setInvitedRehearsal(StringUtils.hasText(cells[4]));
                if (group.getInvitees() != null)
                    group.getInvitees().clear();
                for (int i = 5; i < cells.length; ++i) {
                    if (StringUtils.hasText(cells[i].trim())) {
                        Invitee invitee = new Invitee();
                        invitee.setName(cells[i].trim());
                        group.addInvitee(invitee);
                    }
                }
                if (group.getInvitees().size() == 0)
                    throw new RuntimeException("Group with no invitees: " + row);
                if (group.getId() == null) {
                    group.setId(randomId());
                    db.create(group);
                    System.out.println("Created " + group.getGroupName());
                } else {
                    db.update(group);
                    System.out.println("Updated " + group.getId() + " " + group.getGroupName());
                }
            }
        }
        return "redirect:admin";
    }

    /*
    @RequestMapping("/cleanup")
    public String cleanup() {
       ViewQuery query = new ViewQuery().designDocId("_design/groups").viewName("groups").includeDocs(true);
       List<InvitationGroup> groups = db.queryView(query, InvitationGroup.class);
       for (InvitationGroup group : groups) {
     group.setInvitedRehearsal(false);
     db.update(group);
     //if (group.getGroupName().equals("Group Name") || group.getGroupName().equals("Al Graham"))
     //   db.delete(group);
       }
       return "redirect:admin";
    }
    */

    /**
      * @param input
      * @return
      */
    private String standardizeName(String input) {
        return input.replaceAll(",", "").trim();
    }

    @RequestMapping("/saidNo")
    @ResponseBody
    public String saidNo(@RequestParam("codes") String codes) throws Exception {
        StringBuilder log = new StringBuilder();
        for (StringTokenizer st = new StringTokenizer(codes, ", "); st.hasMoreTokens();) {
            String groupId = st.nextToken();
            InvitationGroup group = db.get(InvitationGroup.class, groupId);
            for (Invitee inv : group.getInvitees()) {
                inv.setAttendingWednesday(false);
                inv.setAttendingThursday(false);
                inv.setAttendingFriday(false);
                inv.setAttendingRehearsal(false);
                inv.setAttendingCeremony(false);
                inv.setAttendingFiesta(false);
            }
            db.update(group);
            log.append("Updated " + group.getGroupName() + " \n<br/>");
        }
        return log.toString();
    }

    @RequestMapping("/saidYes")
    @ResponseBody
    public String saidYes(@RequestParam("codes") String codes) throws Exception {
        StringBuilder log = new StringBuilder();
        for (StringTokenizer st = new StringTokenizer(codes, ", "); st.hasMoreTokens();) {
            String groupId = st.nextToken();
            InvitationGroup group = db.get(InvitationGroup.class, groupId);
            for (Invitee inv : group.getInvitees()) {
                if (group.isInvitedTours()) {
                    inv.setAttendingWednesday(true);
                    inv.setAttendingThursday(true);
                    inv.setAttendingFriday(true);
                }
                if (group.isInvitedRehearsal())
                    inv.setAttendingRehearsal(true);
                inv.setAttendingCeremony(true);
                inv.setAttendingFiesta(true);
            }
            db.update(group);
            log.append("Updated " + group.getGroupName() + " \n<br/>");
        }
        return log.toString();
    }

    @RequestMapping("/testmail")
    @ResponseBody
    public String testMail() throws Exception {
        MimeMessage message = mailSender.createMimeMessage();
        //SimpleMailMessage msg = new SimpleMailMessage();
        MimeMessageHelper msg = new MimeMessageHelper(message, "UTF-8");
        msg.setFrom("Darius and Monica <campodejazayeri@gmail.com>");
        msg.setTo("djazayeri@gmail.com");
        msg.setSubject("Testing wedding mail");
        msg.setText("Monica Campo Patio sabe escribir con .");
        mailSender.send(message);
        return "Sent!";
    }

    @RequestMapping("/sendmail")
    public String sendMail(@RequestParam(value = "emailLanguage", required = false) String language,
            @RequestParam(value = "whichPeople", required = false) String whichPeople,
            @RequestParam(value = "codes", required = false) String whichCodes,
            @RequestParam("subject") String subject, @RequestParam("body") String body, HttpSession session) {
        if (!StringUtils.hasText(whichCodes)
                && !(StringUtils.hasText(language) && StringUtils.hasText(whichPeople))) {
            throw new RuntimeException("Must give codes or language & which");
        }
        if (!StringUtils.hasText(subject))
            throw new RuntimeException("Missing Subject");
        if (!StringUtils.hasText(body))
            throw new RuntimeException("Missing Body");
        if (body.indexOf("$code") < 0 || body.indexOf("$name") < 0)
            throw new RuntimeException("Must have $code and $name");

        if (!"en".equals(language) && !"es".equals(language))
            throw new RuntimeException("Must specify language");

        List<String> codes = new LinkedList<String>();

        if (StringUtils.hasText(whichCodes)) {
            for (StringTokenizer st = new StringTokenizer(whichCodes, ", "); st.hasMoreTokens();) {
                String groupId = st.nextToken();
                InvitationGroup group = db.get(InvitationGroup.class, groupId);
                if (group != null)
                    codes.add(groupId);
            }

        } else {
            ViewQuery query = new ViewQuery().designDocId("_design/groups").viewName("groups").includeDocs(true);
            List<InvitationGroup> groups = db.queryView(query, InvitationGroup.class);
            for (InvitationGroup group : groups) {
                if (!whichPeople.equals("all")) {
                    boolean anyYes = false;
                    boolean anyNo = false;
                    boolean anyNotYet = false;
                    for (Invitee inv : group.getInvitees()) {
                        Boolean coming = inv.getAttendingCeremony();
                        if (coming == null) {
                            anyNotYet = true;
                        } else if (coming) {
                            anyYes = true;
                        } else {
                            anyNo = true;
                        }
                    }
                    boolean treatAsYes = anyYes && !anyNotYet;

                    if (whichPeople.equals("notYet") && !anyNotYet) {
                        continue;
                    } else if (whichPeople.equals("yes") && !treatAsYes) {
                        continue;
                    }
                }
                if (group.getLanguage() == null)
                    throw new RuntimeException(
                            "Group " + group.getId() + " (" + group.getGroupName() + ") doesn't have a language");
                if (group.getLanguage().equals(language))
                    codes.add(group.getId());
            }

            //codes.add("4659");
        }

        session.setAttribute("wedding-mail-to", codes);
        session.setAttribute("wedding-mail-subject", subject);
        session.setAttribute("wedding-mail-body", body);

        return "redirect:sendingmail";
    }

    @RequestMapping("/sendingmail")
    public String sendingMail(HttpSession session, Model model,
            @RequestParam(required = false, value = "sendNum") Integer sendNum) throws Exception {
        List<String> codesLeft = (List<String>) session.getAttribute("wedding-mail-to");
        String subject = (String) session.getAttribute("wedding-mail-subject");
        String body = (String) session.getAttribute("wedding-mail-body");
        if (sendNum != null) {
            for (int i = 0; i < sendNum; ++i) {
                if (codesLeft.size() == 0)
                    break;
                String groupId = codesLeft.remove(0);
                InvitationGroup group = db.get(InvitationGroup.class, groupId);
                String msgBody = body.replaceAll("\\$code", group.getId());
                msgBody = msgBody.replaceAll("\\$name", group.getGroupName());
                sendEmail(group.getEmail(), subject, msgBody);
            }
        }

        if (codesLeft.size() == 0) {
            return "redirect:/admin";
        } else {
            model.addAttribute("subject", subject);
            model.addAttribute("body", body);
            model.addAttribute("numLeft", codesLeft.size());
            return null;
        }
    }

    private void sendEmail(String to, String subject, String body) throws Exception {
        MimeMessage msg = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(msg, "UTF-8");
        helper.setFrom("Darius and Monica <campodejazayeri@gmail.com>");
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(body);
        mailSender.send(msg);
    }

    @RequestMapping("/fixRehearsal")
    public void fixRehearsal() throws Exception {
        ViewQuery query = new ViewQuery().designDocId("_design/groups").viewName("groups").includeDocs(true);
        List<InvitationGroup> groups = db.queryView(query, InvitationGroup.class);
        for (InvitationGroup group : groups) {
            boolean changed = false;
            for (Invitee inv : group.getInvitees()) {
                if (inv.getAttendingFriday() != null && inv.getAttendingFriday()) {
                    if (inv.getAttendingRehearsal() == null || !inv.getAttendingRehearsal()) {
                        inv.setAttendingRehearsal(true);
                        changed = true;
                    }
                }
            }
            if (group.isInvitedTours() && !group.isInvitedRehearsal()) {
                group.setInvitedRehearsal(true);
                changed = true;
            } else {
                System.out.println("Not invited to rehearsal: " + group.getGroupName());
            }
            if (changed)
                db.update(group);
        }
    }
}