//package todo; import java.util.HashMap; import spark.Filter; import spark.Request; import spark.Response; import spark.Spark; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Main class that sets up the to-do server, which allows users to read and * update a to-do list. */ public class TodoServer { private static Logger log = LoggerFactory.getLogger(TodoServer.class); public static void main(String[] args) { CorsFilter.apply(); // make this easier to use in development // this would be disabled in production Spark.before((request, response) -> { log.info(request.requestMethod() + " " + request.url()); }); // Stores the current to-do list (just in memory... not saved anywhere). TodoList list = new TodoList(5); // 5 seconds just for demo // Return the current list with one item per line. Spark.get("/list", (req, res) -> { res.type("text/plain"); return list.describe(); }); // Adds the given item (?name=...) if not already present. Spark.post("/add", (req, res) -> { String name = req.queryParams("name"); if (name == null) { res.status(400); return "name missing"; } else { res.type("text/plain"); if (!list.has(name)) { list.add(name); return "added"; } else { return "added already"; } } }); // Marks the given item as completed (right now). Spark.post("/completed", (req, res) -> { String name = req.queryParams("name"); if (name == null) { res.status(400); return "name missing"; } else if (!list.has(name)) { res.status(400); return "item not found"; } else { res.type("text/plain"); list.completed(name); return "done"; } }); } } /** * Simple Spark filter to set CORS headers on all responses */ final class CorsFilter { private static final HashMap corsHeaders = new HashMap(); static { corsHeaders.put("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS"); corsHeaders.put("Access-Control-Allow-Origin", "*"); corsHeaders.put("Access-Control-Allow-Headers", "Content-Type,Authorization,X-Requested-With,Content-Length,Accept,Origin,"); corsHeaders.put("Access-Control-Allow-Credentials", "true"); } public final static void apply() { Filter filter = new Filter() { @Override public void handle(Request request, Response response) throws Exception { corsHeaders.forEach((key, value) -> { response.header(key, value); }); } }; Spark.after(filter); } }