/* * gw2live - GuildWars 2 Dynamic Map * * Website: http://gw2map.com * * Copyright 2013 zyclonite networx * http://zyclonite.net * Developer: Lukas Prettenthaler */ package net.zyclonite.gw2live.handler; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.Date; import java.util.List; import net.zyclonite.gw2live.model.GuildDetails; import net.zyclonite.gw2live.service.Gw2Client; import net.zyclonite.gw2live.service.MongoDB; import net.zyclonite.gw2live.util.AppConfig; import net.zyclonite.gw2live.util.LocalCache; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.vertx.java.core.Handler; import org.vertx.java.core.http.HttpServerRequest; /** * * @author zyclonite */ public class RestHandler implements Handler<HttpServerRequest> { private static final Log LOG = LogFactory.getLog(RestHandler.class); private final ObjectMapper mapper; private final MongoDB db; private final Gw2Client client; private final String crossdomainpolicy; public RestHandler() { mapper = new ObjectMapper(); db = MongoDB.getInstance(); client = Gw2Client.getInstance(); final AppConfig config = AppConfig.getInstance(); crossdomainpolicy = config.getString("webservice.cross-domain-policy", "*"); } @Override public void handle(final HttpServerRequest req) { req.response().setStatusCode(200); req.response().putHeader("Content-Type", "application/json; charset=utf-8"); req.response().putHeader("Access-Control-Allow-Origin", crossdomainpolicy); LOG.debug("got GET request path: " + req.path()); final String endpoint = req.params().get("endpoint"); String output; try { switch (endpoint) { case "appconfig": req.response().putHeader("Cache-Control", "max-age=3600");//cache for 1h output = "{\"wvw\":" + LocalCache.WVW_ENABLED + ",\"pve\":" + LocalCache.PVE_ENABLED + "}"; break; case "servertime": req.response().putHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0"); req.response().putHeader("Pragma", "no-cache"); output = mapper.writeValueAsString(new Date()); break; case "pveevents": req.response().putHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0"); req.response().putHeader("Pragma", "no-cache"); if (req.params().contains("world")) { if (req.params().contains("map")) { output = mapper.writeValueAsString(db.findPveEvents(Long.parseLong(req.params().get("world")), Long.parseLong(req.params().get("map")))); } else { output = mapper.writeValueAsString(db.findPveEvents(Long.parseLong(req.params().get("world")))); } } else { output = "{\"error\":\"missing world parameter\"}"; //output = mapper.writeValueAsString(db.findPveEvents()); } break; case "wvwevents": req.response().putHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0"); req.response().putHeader("Pragma", "no-cache"); if (req.params().contains("match")) { if (req.params().contains("map")) { output = mapper.writeValueAsString(db.findWvwEvents(req.params().get("match"), req.params().get("map"))); } else { output = mapper.writeValueAsString(db.findWvwEvents(req.params().get("match"))); } } else { output = "{\"error\":\"missing match parameter\"}"; //output = mapper.writeValueAsString(db.findWvwEvents()); } break; case "pveeventnames": req.response().putHeader("Cache-Control", "max-age=600");//cache for 10min if (req.params().contains("lang")) { output = mapper.writeValueAsString(db.findPveEventNames(req.params().get("lang"))); } else { output = mapper.writeValueAsString(db.findPveEventNames()); } break; case "pvemapnames": req.response().putHeader("Cache-Control", "max-age=3600");//cache for 1h if (req.params().contains("lang")) { output = mapper.writeValueAsString(db.findPveMapNames(req.params().get("lang"))); } else { output = mapper.writeValueAsString(db.findPveMapNames()); } break; case "pveworldnames": req.response().putHeader("Cache-Control", "max-age=3600");//cache for 1h if (req.params().contains("lang")) { output = mapper.writeValueAsString(db.findPveWorldNames(req.params().get("lang"))); } else { output = mapper.writeValueAsString(db.findPveWorldNames()); } break; case "wvwmatches": req.response().putHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0"); req.response().putHeader("Pragma", "no-cache"); output = mapper.writeValueAsString(db.findWvwMatches()); break; case "wvwscores": req.response().putHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0"); req.response().putHeader("Pragma", "no-cache"); if (req.params().contains("match")) { output = mapper.writeValueAsString(db.findWvwScores(req.params().get("match"))); } else { output = mapper.writeValueAsString(db.findWvwScores()); } break; case "wvwmapnames": req.response().putHeader("Cache-Control", "max-age=3600");//cache for 1h if (req.params().contains("lang")) { output = mapper.writeValueAsString(db.findWvwMapNames(req.params().get("lang"))); } else { output = mapper.writeValueAsString(db.findWvwMapNames()); } break; case "wvwobjectivenames": req.response().putHeader("Cache-Control", "max-age=3600");//cache for 1h if (req.params().contains("lang")) { output = mapper.writeValueAsString(db.findWvwObjectiveNames(req.params().get("lang"))); } else { output = mapper.writeValueAsString(db.findWvwObjectiveNames()); } break; case "wvwobjectivelongnames": req.response().putHeader("Cache-Control", "max-age=3600");//cache for 1h if (req.params().contains("lang")) { output = mapper.writeValueAsString(db.findWvwObjectiveLongNames(req.params().get("lang"))); } else { output = mapper.writeValueAsString(db.findWvwObjectiveLongNames()); } break; case "wvwobjectivedetails": req.response().putHeader("Cache-Control", "max-age=3600");//cache for 1h output = mapper.writeValueAsString(db.findWvwObjectiveDetails()); break; case "guilddetails": req.response().putHeader("Cache-Control", "max-age=3600");//cache for 1h if (req.params().contains("guildid")) { final List<GuildDetails> guilds = new ArrayList<>(); final GuildDetails guild = db.findGuildDetailsById(req.params().get("guildid")); if (guild == null || guild.needsRenewal()) { final GuildDetails guild_new = client.getGuildDetails(req.params().get("guildid")); if (guild_new != null) { guilds.add(guild_new); db.saveGuildDetails(guilds); } } else { guilds.add(guild); } output = mapper.writeValueAsString(guilds); } else { if (req.params().contains("guildname")) { output = mapper.writeValueAsString(db.findGuildDetailsByName(req.params().get("guildname"))); } else { output = "{\"error\":\"missing guildid or guildname parameter\"}"; } } break; case "wvwcoordinates": req.response().putHeader("Cache-Control", "max-age=21600");//cache for 6h output = mapper.writeValueAsString(db.findWvwCoordinates()); break; case "pvecoordinates": req.response().putHeader("Cache-Control", "max-age=21600");//cache for 6h output = mapper.writeValueAsString(db.findPveCoordinates()); break; case "chatmessages": req.response().putHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0"); req.response().putHeader("Pragma", "no-cache"); if (req.params().contains("channel")) { output = mapper.writeValueAsString(db.findChatMessages(req.params().get("channel"))); } else { output = "{\"error\":\"missing channel parameter\"}"; } break; case "pveeventdetails": req.response().putHeader("Cache-Control", "max-age=3600");//cache for 1h if (req.params().contains("map")) { output = mapper.writeValueAsString(db.findPveEventDetails(Long.parseLong(req.params().get("map")))); } else if (req.params().contains("event")) { output = mapper.writeValueAsString(db.findPveEventDetails(req.params().get("event"))); } else { output = mapper.writeValueAsString(db.findPveEventDetails()); } break; case "maps": req.response().putHeader("Cache-Control", "max-age=21600");//cache for 1h if (req.params().contains("map")) { output = mapper.writeValueAsString(db.findMap(req.params().get("map"))); } else { output = "{\"error\":\"missing map parameter\"}"; } break; case "topguilds": req.response().putHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0"); req.response().putHeader("Pragma", "no-cache"); if (req.params().contains("match")) { output = db.getTopGuilds(req.params().get("match")); } else { output = "{\"error\":\"missing match id\"}"; } break; default: output = "{\"error\":\"wrong endpoint\"}"; } } catch (JsonProcessingException ex) { output = "{\"error\":\"server error\"}"; LOG.warn("could not translate object to json " + ex.getMessage()); } req.response().end(output); } }