Advertisement
Guest User

Untitled

a guest
Dec 15th, 2016
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Groovy 3.20 KB | None | 0 0
  1. @Grapes([
  2.     @Grab("io.undertow:undertow-core:2.0.0.Alpha1"),
  3.     @Grab("org.apache.commons:commons-dbcp2:2.1.1"),
  4.     @Grab("org.postgresql:postgresql:9.3-1102-jdbc41"),
  5.     @GrabConfig(systemClassLoader=true)
  6. ])
  7. import io.undertow.Undertow
  8. import io.undertow.server.HttpHandler
  9. import io.undertow.server.HttpServerExchange
  10. import io.undertow.util.Headers
  11. import org.apache.commons.dbcp2.BasicDataSourceFactory
  12. import groovy.sql.Sql
  13.  
  14.  
  15. class App implements HttpHandler {
  16.  
  17.     Sql sql
  18.     def tableName
  19.  
  20.     def run() {
  21.         initDataSource()
  22.  
  23.         tableName = sql.expand(env("TABLE_NAME", "short_urls"))
  24.  
  25.         runServer()
  26.     }
  27.  
  28.     def initDataSource() {
  29.         println "Initializing DB connection pool..."
  30.  
  31.         Class.forName("org.postgresql.Driver")
  32.         def dbProperties = new Properties([
  33.             driverClassName: "org.postgresql.Driver",
  34.             url: "jdbc:postgresql://${env("PG_PATH")}" as String,
  35.             username: env("PG_USERNAME"),
  36.             password: env("PG_PASSWORD"),
  37.         ])
  38.         println dbProperties
  39.         def dataSource = BasicDataSourceFactory.createDataSource(dbProperties)
  40.         sql = new Sql(dataSource)
  41.     }
  42.  
  43.     def runServer() {
  44.         println "Running web server..."
  45.         def port = env("SERVER_PORT", "8080") as Integer
  46.         def host = env("SERVER_HOST", "localhost")
  47.         Undertow.builder()
  48.             .addHttpListener(port, host)
  49.             .setHandler(this).build().start()
  50.     }
  51.  
  52.     @Override
  53.     void handleRequest(HttpServerExchange exchange) throws Exception {
  54.         def url = exchange.queryParameters?.get("url")?.first
  55.         if (!url) {
  56.             exchange.responseSender.send("Please specify `url` parameter in the query string")
  57.             exchange.statusCode = 400
  58.             return
  59.         }
  60.  
  61.         def response = "Method $exchange.requestMethod is not supported"
  62.         switch (exchange.requestMethod as String) {
  63.             case "GET":
  64.                 response = readFull(url) ?: "NO_FULL_URL"
  65.                 break;
  66.             case "POST":
  67.                 response = createFull(url)
  68.                 break
  69.             default:
  70.                 exchange.statusCode = 400
  71.         }
  72.  
  73.         exchange.responseHeaders.put(Headers.CONTENT_TYPE, "text/plain")
  74.         exchange.responseSender.send(response as String)
  75.     }
  76.  
  77.     def readFull(shortLink) {
  78.         def id = Long.parseLong(shortLink, Character.MAX_RADIX)
  79.         def result = sql.firstRow("SELECT url FROM $tableName WHERE id=$id AND NOW() < expires_on LIMIT 1")
  80.         result?.url
  81.     }
  82.  
  83.     def createFull(shortLink) {
  84.         def id = sql.firstRow("""
  85.            UPDATE $tableName SET url=$shortLink, expires_on=DEFAULT
  86.            FROM(SELECT id FROM $tableName WHERE NOW() > expires_on LIMIT 1 FOR UPDATE) expired
  87.            WHERE ${tableName}.id = expired.id
  88.            RETURNING ${tableName}.id""")?.id
  89.         id = id?: sql.firstRow("INSERT INTO $tableName(url) VALUES ($shortLink) RETURNING id").id
  90.         Long.toString(id, Character.MAX_RADIX)
  91.     }
  92.  
  93.     def env(varname, defaultValue = null) {
  94.         System.getenv(varname) ?: System.getProperty(varname) ?: defaultValue
  95.     }
  96. }
  97.  
  98. new App().run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement