package io.vertx.example.web.angularjs; import io.vertx.core.AbstractVerticle; import io.vertx.core.http.HttpHeaders; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; import io.vertx.example.util.Runner; import io.vertx.ext.mongo.MongoClient; import io.vertx.ext.web.Router; import io.vertx.ext.web.handler.BodyHandler; import io.vertx.ext.web.handler.StaticHandler; import java.util.LinkedList; import java.util.List; /* * @author <a href="mailto:pmlopes@gmail.com">Paulo Lopes</a> */ public class Server extends AbstractVerticle { // Convenience method so you can run it in your IDE public static void main(String[] args) { Runner.runExample(Server.class); } private MongoClient mongo; @Override public void start() throws Exception { // Create a mongo client using all defaults (connect to localhost and default port) using the database name "demo". mongo = MongoClient.createShared(vertx, new JsonObject().put("db_name", "demo")); // the load function just populates some data on the storage loadData(mongo); Router router = Router.router(vertx); router.route().handler(BodyHandler.create()); // define some REST API router.get("/api/users").handler(ctx -> { mongo.find("users", new JsonObject(), lookup -> { // error handling if (lookup.failed()) { ctx.fail(500); return; } // now convert the list to a JsonArray because it will be easier to encode the final object as the response. final JsonArray json = new JsonArray(); for (JsonObject o : lookup.result()) { json.add(o); } ctx.response().putHeader(HttpHeaders.CONTENT_TYPE, "application/json"); ctx.response().end(json.encode()); }); }); router.get("/api/users/:id").handler(ctx -> { mongo.findOne("users", new JsonObject().put("_id", ctx.request().getParam("id")), null, lookup -> { // error handling if (lookup.failed()) { ctx.fail(500); return; } JsonObject user = lookup.result(); if (user == null) { ctx.fail(404); } else { ctx.response().putHeader(HttpHeaders.CONTENT_TYPE, "application/json"); ctx.response().end(user.encode()); } }); }); router.post("/api/users").handler(ctx -> { JsonObject newUser = ctx.getBodyAsJson(); mongo.findOne("users", new JsonObject().put("username", newUser.getString("username")), null, lookup -> { // error handling if (lookup.failed()) { ctx.fail(500); return; } JsonObject user = lookup.result(); if (user != null) { // already exists ctx.fail(500); } else { mongo.insert("users", newUser, insert -> { // error handling if (insert.failed()) { ctx.fail(500); return; } // add the generated id to the user object newUser.put("_id", insert.result()); ctx.response().putHeader(HttpHeaders.CONTENT_TYPE, "application/json"); ctx.response().end(newUser.encode()); }); } }); }); router.put("/api/users/:id").handler(ctx -> { mongo.findOne("users", new JsonObject().put("_id", ctx.request().getParam("id")), null, lookup -> { // error handling if (lookup.failed()) { ctx.fail(500); return; } JsonObject user = lookup.result(); if (user == null) { // does not exist ctx.fail(404); } else { // update the user properties JsonObject update = ctx.getBodyAsJson(); user.put("username", update.getString("username")); user.put("firstName", update.getString("firstName")); user.put("lastName", update.getString("lastName")); user.put("address", update.getString("address")); mongo.replace("users", new JsonObject().put("_id", ctx.request().getParam("id")), user, replace -> { // error handling if (replace.failed()) { ctx.fail(500); return; } ctx.response().putHeader(HttpHeaders.CONTENT_TYPE, "application/json"); ctx.response().end(user.encode()); }); } }); }); router.delete("/api/users/:id").handler(ctx -> { mongo.findOne("users", new JsonObject().put("_id", ctx.request().getParam("id")), null, lookup -> { // error handling if (lookup.failed()) { ctx.fail(500); return; } JsonObject user = lookup.result(); if (user == null) { // does not exist ctx.fail(404); } else { mongo.remove("users", new JsonObject().put("_id", ctx.request().getParam("id")), remove -> { // error handling if (remove.failed()) { ctx.fail(500); return; } ctx.response().setStatusCode(204); ctx.response().end(); }); } }); }); // Create a router endpoint for the static content. router.route().handler(StaticHandler.create()); vertx.createHttpServer().requestHandler(router::accept).listen(8080); } private void loadData(MongoClient db) { db.dropCollection("users", drop -> { if (drop.failed()) { throw new RuntimeException(drop.cause()); } List<JsonObject> users = new LinkedList<>(); users.add(new JsonObject() .put("username", "pmlopes") .put("firstName", "Paulo") .put("lastName", "Lopes") .put("address", "The Netherlands")); users.add(new JsonObject() .put("username", "timfox") .put("firstName", "Tim") .put("lastName", "Fox") .put("address", "The Moon")); for (JsonObject user : users) { db.insert("users", user, res -> { System.out.println("inserted " + user.encode()); }); } }); } }