Java tutorial
/* * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.fitibo.aotearoa.controller; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.fitibo.aotearoa.annotation.Authentication; import com.fitibo.aotearoa.constants.CommonConstants; import com.fitibo.aotearoa.constants.OrderStatus; import com.fitibo.aotearoa.dto.Role; import com.fitibo.aotearoa.exception.ResourceNotFoundException; import com.fitibo.aotearoa.mapper.AgentMapper; import com.fitibo.aotearoa.mapper.OrderMapper; import com.fitibo.aotearoa.mapper.OrderTicketMapper; import com.fitibo.aotearoa.mapper.SkuMapper; import com.fitibo.aotearoa.mapper.SkuTicketMapper; import com.fitibo.aotearoa.mapper.SkuTicketPriceMapper; import com.fitibo.aotearoa.model.Agent; import com.fitibo.aotearoa.model.Category; import com.fitibo.aotearoa.model.City; import com.fitibo.aotearoa.model.Duration; import com.fitibo.aotearoa.model.Order; import com.fitibo.aotearoa.model.Sku; import com.fitibo.aotearoa.model.SkuTicket; import com.fitibo.aotearoa.model.SkuTicketPrice; import com.fitibo.aotearoa.model.Vendor; import com.fitibo.aotearoa.service.CategoryService; import com.fitibo.aotearoa.service.CityService; import com.fitibo.aotearoa.service.DurationService; import com.fitibo.aotearoa.service.VendorService; import com.fitibo.aotearoa.util.ObjectParser; import com.fitibo.aotearoa.util.OrderOperationUtils; import com.fitibo.aotearoa.vo.AgentVo; import com.fitibo.aotearoa.vo.SkuVo; import org.apache.ibatis.session.RowBounds; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; import java.util.Map; @Controller public class HomeController extends AuthenticationRequiredController { public static final String MODULE_DASHBOARD = "dashboard"; public static final String MODULE_CREATE_ORDER = "create_order"; public static final String MODULE_QUERY_ORDER = "query_order"; public static final String MODULE_ORDER_DETAIL = "order_detail"; public static final String MODULE_CREATE_SKU = "create_sku"; public static final String MODULE_QUERY_SKU = "query_sku"; public static final String MODULE_QUERY_VENDOR = "query_vendor"; public static final String MODULE_CREATE_VENDOR = "create_vendor"; public static final String MODULE_SKU_DETAIL = "sku_detail"; public static final String MODULE_VENDOR_DETAIL = "vendor_detail"; public static final String MODULE_SKU_TICKET_DETAIL = "sku_ticket_detail"; public static final String MODULE_QUERY_AGENT = "query_agent"; public static final String MODULE_AGENT_DETAIL = "agent_detail"; public static final String MODULE_CREATE_AGENT = "create_agent"; @Autowired private CityService cityService; @Autowired private CategoryService categoryService; @Autowired private VendorService vendorService; @Autowired private DurationService durationService; @Autowired private SkuMapper skuMapper; @Autowired private SkuTicketMapper skuTicketMapper; @Autowired private SkuTicketPriceMapper skuTicketPriceMapper; @Autowired private OrderMapper orderMapper; @Autowired private OrderTicketMapper orderTicketMapper; @Autowired private AgentMapper agentMapper; @ExceptionHandler public String handleException(ResourceNotFoundException ex) { return "404"; } @RequestMapping("signin") public String signin(Map<String, Object> model) { return "signin"; } @RequestMapping("") @Authentication public String home(Map<String, Object> model) { model.put("module", MODULE_DASHBOARD); return "dashboard"; } @RequestMapping("dashboard") @Authentication public String dashboard(Map<String, Object> model) { model.put("module", MODULE_DASHBOARD); return "dashboard"; } @RequestMapping("create_order") @Authentication public String createOrder(@RequestParam("skuId") int skuId, Map<String, Object> model) { Sku sku = skuMapper.findById(skuId); if (sku == null) { throw new ResourceNotFoundException(); } model.put("sku", parse(sku, cityService.findAll(), categoryService.findAll(), vendorService.findAll(), durationService.findAll())); model.put("vendor", vendorService.findAll().get(sku.getVendorId())); model.put("module", MODULE_CREATE_ORDER); return "create_order"; } @RequestMapping("orders") @Authentication public String queryOrder(@RequestParam(value = "keyword", defaultValue = "") String keyword, @RequestParam(value = "uuid", defaultValue = "") String uuid, @RequestParam(value = "referencenumber", defaultValue = "") String referenceNumber, @RequestParam(value = "status", defaultValue = "0") int status, @RequestParam(value = "pagesize", defaultValue = "10") int pageSize, @RequestParam(value = "pagenumber", defaultValue = "0") int pageNumber, Map<String, Object> model) { Preconditions.checkNotNull(getToken()); model.put("module", MODULE_QUERY_ORDER); model.put("statusList", OrderStatus.values()); model.put("status", status); model.put("pageSize", pageSize); model.put("pageNumber", pageNumber); model.put("keyword", keyword); model.put("uuid", uuid); model.put("referenceNumber", referenceNumber); switch (getToken().getRole()) { case Admin: model.put("orders", orderMapper.findAllByMultiFields(uuid, keyword, referenceNumber, status, new RowBounds(pageNumber * pageSize, pageSize))); break; case Agent: model.put("orders", orderMapper.findByAgentIdAndMultiFields(getToken().getId(), uuid, keyword, referenceNumber, status, new RowBounds(pageNumber * pageSize, pageSize))); break; default: throw new ResourceNotFoundException(); } return "orders"; } @RequestMapping("orders/{id}") @Authentication public String orderDetail(@PathVariable("id") int id, Map<String, Object> model) { Order order = orderMapper.findById(id); if (order == null) { throw new ResourceNotFoundException(); } model.put("order", order); model.put("tickets", Lists.transform(orderTicketMapper.findByOrderId(order.getId()), ObjectParser::parse)); model.put("module", MODULE_ORDER_DETAIL); model.put("statusList", OrderStatus.values()); model.put("editing", false); model.put("operations", OrderOperationUtils.getFollowOperations(order.getStatus())); return "order_detail"; } @RequestMapping("orders/{id}/_edit") @Authentication(Role.Admin) public String editOrder(@PathVariable("id") int id, Map<String, Object> model) { Order order = orderMapper.findById(id); if (order == null) { throw new ResourceNotFoundException(); } model.put("order", order); model.put("tickets", Lists.transform(orderTicketMapper.findByOrderId(order.getId()), ObjectParser::parse)); Sku sku = skuMapper.findById(order.getSkuId()); if (sku == null) { throw new ResourceNotFoundException(); } model.put("sku", parse(sku, cityService.findAll(), categoryService.findAll(), vendorService.findAll(), durationService.findAll())); model.put("module", MODULE_ORDER_DETAIL); model.put("statusList", OrderStatus.values()); model.put("editing", true); return "order_detail"; } @RequestMapping("create_sku") @Authentication(Role.Admin) public String createSku(Map<String, Object> model) { model.put("module", MODULE_CREATE_SKU); model.put("cities", Lists.newArrayList(cityService.findAll().values())); model.put("categories", Lists.newArrayList(categoryService.findAll().values())); model.put("vendors", Lists.newArrayList(vendorService.findAll().values())); model.put("durations", Lists.newArrayList(durationService.findAll().values())); return "create_sku"; } @RequestMapping("skus/{id}") @Authentication public String skuDetail(@PathVariable("id") int id, Map<String, Object> model) { model.put("module", MODULE_SKU_DETAIL); Sku sku = skuMapper.findById(id); if (sku == null) { throw new ResourceNotFoundException(); } model.put("sku", parse(sku, cityService.findAll(), categoryService.findAll(), vendorService.findAll(), durationService.findAll())); model.put("editing", false); return "sku_detail"; } @RequestMapping("skus/{id}/_edit") @Authentication(Role.Admin) public String editSku(@PathVariable("id") int id, Map<String, Object> model) { Sku sku = skuMapper.findById(id); if (sku == null) { throw new ResourceNotFoundException(); } model.put("module", MODULE_SKU_DETAIL); model.put("sku", parse(sku, cityService.findAll(), categoryService.findAll(), vendorService.findAll(), durationService.findAll())); model.put("cities", Lists.newArrayList(cityService.findAll().values())); model.put("categories", Lists.newArrayList(categoryService.findAll().values())); model.put("vendors", Lists.newArrayList(vendorService.findAll().values())); model.put("durations", Lists.newArrayList(durationService.findAll().values())); model.put("editing", true); return "sku_detail"; } @RequestMapping("skus/{skuId}/tickets/{ticketId}") @Authentication(Role.Admin) public String skuTicketDetail(@PathVariable("skuId") int skuId, @PathVariable("ticketId") int ticketId, @RequestParam(value = "pagesize", defaultValue = "10") int pageSize, @RequestParam(value = "pagenumber", defaultValue = "0") int pageNumber, Map<String, Object> model) { SkuTicket ticket = skuTicketMapper.findById(ticketId); if (ticket == null) { throw new ResourceNotFoundException(); } Sku sku = skuMapper.findById(skuId); Preconditions.checkArgument(sku != null && skuId == ticket.getSkuId(), "invalid skuId:" + skuId); List<SkuTicketPrice> skuTicketPrices = skuTicketPriceMapper.findBySkuTicketId(ticket.getId(), new RowBounds(pageNumber * pageSize, pageSize)); model.put("sku", sku); model.put("ticket", ticket); model.put("ticketPrices", Lists.transform(skuTicketPrices, ObjectParser::parse)); model.put("module", MODULE_SKU_TICKET_DETAIL); model.put("pageSize", pageSize); model.put("pageNumber", pageNumber); model.put("skuId", skuId); model.put("ticketId", ticketId); return "sku_ticket_detail"; } @RequestMapping("skus") @Authentication public String querySku(@RequestParam(value = "keyword", defaultValue = "") String keyword, @RequestParam(value = "cityid", defaultValue = "0") int cityId, @RequestParam(value = "categoryid", defaultValue = "0") int categoryId, @RequestParam(value = "pagesize", defaultValue = "10") int pageSize, @RequestParam(value = "pagenumber", defaultValue = "0") int pageNumber, Map<String, Object> model) { Map<Integer, City> cityMap = cityService.findAll(); Map<Integer, Category> categoryMap = categoryService.findAll(); Map<Integer, Vendor> vendorMap = vendorService.findAll(); Map<Integer, Duration> durationMap = durationService.findAll(); RowBounds rowBounds = new RowBounds(pageNumber * pageSize, pageSize); model.put("module", MODULE_QUERY_SKU); model.put("cityId", cityId); model.put("categoryId", categoryId); model.put("keyword", keyword); model.put("cities", Lists.newArrayList(cityMap.values())); model.put("categories", Lists.newArrayList(categoryMap.values())); model.put("durations", Lists.newArrayList(durationMap.values())); model.put("skus", Lists.transform(searchSku(keyword, cityId, categoryId, rowBounds), (input) -> parse(input, cityMap, categoryMap, vendorMap, durationMap))); model.put("pageSize", pageSize); model.put("pageNumber", pageNumber); return "skus"; } @RequestMapping("create_vendor") @Authentication(Role.Admin) public String createVendor(Map<String, Object> model) { model.put("module", MODULE_CREATE_VENDOR); return "create_vendor"; } @RequestMapping("vendors") @Authentication(Role.Admin) public String queryVendor(Map<String, Object> model) { Map<Integer, Vendor> vendorMap = vendorService.findAll(); model.put("module", MODULE_QUERY_VENDOR); model.put("vendors", vendorMap.values()); return "vendors"; } @RequestMapping("vendors/{id}") @Authentication(Role.Admin) public String vendorDetail(@PathVariable("id") int id, Map<String, Object> model) { model.put("module", MODULE_VENDOR_DETAIL); Vendor vendor = vendorService.findById(id); if (vendor == null) { throw new ResourceNotFoundException(); } model.put("vendor", vendor); model.put("editing", false); return "vendor_detail"; } @RequestMapping("vendors/{id}/_edit") @Authentication(Role.Admin) public String editVendor(@PathVariable("id") int id, Map<String, Object> model) { model.put("module", MODULE_VENDOR_DETAIL); Vendor vendor = vendorService.findById(id); if (vendor == null) { throw new ResourceNotFoundException(); } model.put("vendor", vendor); model.put("editing", true); return "vendor_detail"; } @RequestMapping("create_agent") @Authentication(Role.Admin) public String createAgent(Map<String, Object> model) { model.put("module", MODULE_CREATE_AGENT); return "create_agent"; } @RequestMapping("agents") @Authentication(Role.Admin) public String queryAgent(Map<String, Object> model) { List<Agent> agents = agentMapper.findAll(); model.put("module", MODULE_QUERY_AGENT); model.put("agents", Lists.transform(agents, (input) -> parse(input))); return "agents"; } @RequestMapping("agents/{id}") @Authentication(Role.Admin) public String agentDetail(@PathVariable("id") int id, Map<String, Object> model) { model.put("module", MODULE_AGENT_DETAIL); Agent agent = agentMapper.findById(id); if (agent == null) { throw new ResourceNotFoundException(); } model.put("agent", parse(agent)); model.put("action", "check"); return "agent_detail"; } @RequestMapping("agents/{id}/_edit") @Authentication(Role.Admin) public String editAgent(@PathVariable("id") int id, Map<String, Object> model) { model.put("module", MODULE_AGENT_DETAIL); Agent agent = agentMapper.findById(id); if (agent == null) { throw new ResourceNotFoundException(); } model.put("agent", parse(agent)); model.put("action", "edit"); return "agent_detail"; } @RequestMapping("agents/{id}/_reset") @Authentication(Role.Admin) public String resetPasswordAgent(@PathVariable("id") int id, Map<String, Object> model) { model.put("module", MODULE_AGENT_DETAIL); Agent agent = agentMapper.findById(id); if (agent == null) { throw new ResourceNotFoundException(); } model.put("agent", parse(agent)); model.put("action", "reset"); return "agent_detail"; } private List<Sku> searchSku(String keyword, int cityId, int categoryId, RowBounds rowBounds) { return skuMapper.findAllByMultiFields(keyword, cityId, categoryId, rowBounds); } private static SkuVo parse(Sku sku, Map<Integer, City> cityMap, Map<Integer, Category> categoryMap, Map<Integer, Vendor> vendorMap, Map<Integer, Duration> durationMap) { SkuVo result = new SkuVo(); result.setId(sku.getId()); result.setName(sku.getName()); result.setUuid(sku.getUuid()); result.setVendorId(sku.getVendorId()); result.setVendor(vendorMap.get(sku.getVendorId()).getName()); result.setDescription(sku.getDescription()); result.setCategoryId(sku.getCategoryId()); result.setCategory(categoryMap.get(sku.getCategoryId()).getName()); result.setCityId(sku.getCityId()); result.setCity(cityMap.get(sku.getCityId()).getName()); result.setGatheringPlace(Lists.newArrayList(sku.getGatheringPlace().split(CommonConstants.SEPARATOR))); result.setPickupService(sku.hasPickupService()); result.setDurationId(sku.getDurationId()); Duration duration = durationMap.get(sku.getDurationId()); result.setDuration(duration != null ? duration.getName() : ""); result.setTickets(Lists.transform(sku.getTickets(), ObjectParser::parse)); return result; } public static AgentVo parse(Agent agent) { AgentVo vo = new AgentVo(); vo.setId(agent.getId()); vo.setUserName(agent.getUserName()); vo.setPassword(agent.getPassword()); vo.setName(agent.getName()); vo.setDescription(agent.getDescription()); vo.setDiscount(agent.getDiscount()); vo.setEmail(agent.getEmail()); return vo; } }