diff options
Diffstat (limited to '')
-rw-r--r-- | src/database.nim | 12 | ||||
-rw-r--r-- | src/short.nim | 23 |
2 files changed, 21 insertions, 14 deletions
diff --git a/src/database.nim b/src/database.nim index 1ffc0df..37ef8b4 100644 --- a/src/database.nim +++ b/src/database.nim @@ -1,6 +1,8 @@ -import tiny_sqlite import std / [options, times] +import tiny_sqlite +import uuids + import dbUtils const migrations = [ @@ -47,7 +49,7 @@ proc Migrate*(db: DbConn): bool {.raises: [].} = type ShortUrl* = object ID*: int - Token*: string + Token*: UUID Title*: string Url*: string Created*: DateTime @@ -58,11 +60,11 @@ proc AddUrl*(db: DbConn, url: ShortUrl) {.raises: [SqliteError].} = INSERT INTO url(token, title, url, created, expires) VALUES (?, ?, ?, ?, ?); """) - stmt.exec(url.Token, url.Title, url.Url, url.Created, $url.Expires) + stmt.exec($url.Token, url.Title, url.Url, url.Created, $url.Expires) -proc GetUrl*(db: DbConn, token: string): ref ShortUrl {.raises: [SqliteError].} = +proc GetUrl*(db: DbConn, token: UUID): ref ShortUrl {.raises: [SqliteError].} = let stmt = db.stmt("SELECT id, title, url, created, expires FROM url WHERE token = ?") - for row in stmt.iterate(token): + for row in stmt.iterate($token): new(result) result.ID = row[0].fromDbValue(int) result.Token = token diff --git a/src/short.nim b/src/short.nim index 8f243c6..5005e16 100644 --- a/src/short.nim +++ b/src/short.nim @@ -1,9 +1,10 @@ import os, strutils -import std/[hashes, oids, re, times, uri] +import std/[hashes, re, times, uri] import tiny_sqlite import jester import nimja/parser +import uuids import database @@ -37,13 +38,12 @@ func renderNoShort(req: ShortUrl): string {.raises: [].} = func renderError(code: int, msg: string): string {.raises: [].} = compileTemplateFile(getScriptDir() / "templates/error.html") -proc handleToken(token: string): (HttpCode, string) {.raises: [].} = +proc handleToken(tokenStr: string): (HttpCode, string) {.raises: [].} = + var token: UUID try: - let tokenRegexp = re"^[\w]{24}$" - if not match(token, tokenRegexp): - return (Http400, renderError(400, "Bad Request")) - except RegexError: - return (Http500, renderError(500, "RegexError")) + token = parseUUID(tokenStr) + except ValueError: + return (Http400, renderError(400, "Bad Request")) db.CleanExpired() try: let req = db.GetUrl(token) @@ -84,14 +84,19 @@ proc handleIndexPost(params: Table[string, string]): (HttpCode, string) {.raises else: return (Http400, renderError(400, "Bad Request")) if input.Title == "" or input.Url == "" or exp == 0: return (Http400, renderError(400, "Bad Request")) - input.Token = $genOid() + try: + input.Token = genUUID() + except IOError: + return (Http500, renderError(500, "IOError on genUUID")) + except OSError: + return (Http500, renderError(500, "OSError on genUUID")) input.Created = times.now() input.Expires = input.Created + initDuration(minutes = exp) try: db.AddUrl(input) except SqliteError: return (Http500, renderShort(input)) - return (Http200, input.Token) + return (Http200, $input.Token) routes: get "/": |