diff --git a/README.md b/README.md index 1f05283..df0b6d7 100644 --- a/README.md +++ b/README.md @@ -6,18 +6,15 @@ TODO: Write a description here ```bash brew tap amberframework/micrate -brew install micrate crystal +brew install micrate + +shards install ``` TODO: Write installation instructions here ## Usage -```bash -crystal build url-shortener.cr --release --progress -ENV=production ./url-shortener -``` - TODO: Write usage instructions here ## Development @@ -27,6 +24,13 @@ DATABASE_URL=sqlite3://./sqlite/data.db micrate up crystal run url-shortener.cr ``` +## Build + +```bash +crystal build url-shortener.cr --release --progress +ENV=production ./url-shortener +``` + ## Contributing 1. Fork it () diff --git a/app/config/kemal.cr b/app/config/kemal.cr index 3c49d66..8b2cf3c 100644 --- a/app/config/kemal.cr +++ b/app/config/kemal.cr @@ -1,5 +1,5 @@ require "kemal" Kemal.config.env = ENV["ENV"]? || "development" -Kemal.config.port = ENV["PORT"]?.try(&.to_i) || 3000 +Kemal.config.port = ENV["PORT"]?.try(&.to_i) || 4000 Kemal.config.host_binding = ENV["HOST"]? || "0.0.0.0" diff --git a/app/controllers/link.cr b/app/controllers/link.cr index efd62b0..a20eda5 100644 --- a/app/controllers/link.cr +++ b/app/controllers/link.cr @@ -10,10 +10,10 @@ module App::Controllers::Link def call(env) json_params = env.params.json.to_h url = json_params.has_key?("url") ? json_params["url"] : nil - raise App::BadRequestException.new(env) if !url #TODO: return url "required field" error message + raise App::BadRequestException.new(env, {"url" => "Required field"}) if !url link = Link.new - link.id = UUID.v4().to_s + link.id = UUID.v4.to_s link.url = url.to_s link.slug = Random::Secure.urlsafe_base64(4) @@ -21,10 +21,10 @@ module App::Controllers::Link if !changeset.valid? errors = {"errors" => map_changeset_errors(changeset.errors)} - raise App::UnprocessableEntityException.new(env, errors.to_json) + raise App::UnprocessableEntityException.new(env, errors) end - response = {"data" => App::Serializers::Link.new(link) } + response = {"data" => App::Serializers::Link.new(link)} response.to_json end end @@ -44,7 +44,7 @@ module App::Controllers::Link changeset = Database.update(link) if changeset.errors.any? - Log.error { "Increase click counter failed: #{changeset.errors}"} + Log.error { "Increase click counter failed: #{changeset.errors}" } end end @@ -62,10 +62,10 @@ module App::Controllers::Link link = Database.get(Link, id) raise App::NotFoundException.new(env) if !link - response = {"data" => App::Serializers::Link.new(link) } + response = {"data" => App::Serializers::Link.new(link)} response.to_json end end - #TODO: update, delete + # TODO: update, delete end diff --git a/app/lib/errors.cr b/app/lib/errors.cr index 954c97a..fd077b4 100644 --- a/app/lib/errors.cr +++ b/app/lib/errors.cr @@ -2,8 +2,9 @@ require "kemal" module App class BadRequestException < Kemal::Exceptions::CustomException - def initialize(context) + def initialize(context, message = Hash(String, String)) context.response.status_code = 400 + context.response.print({ "error" => message }.to_json) super(context) end end @@ -16,11 +17,10 @@ module App end class UnprocessableEntityException < Kemal::Exceptions::CustomException - def initialize(context, @content = "") + def initialize(context, message = Hash(String, String)) context.response.status_code = 422 + context.response.print({ "error" => message }.to_json) super(context) end - - getter :content end end diff --git a/app/serializers/link.cr b/app/serializers/link.cr index b739be2..d735b13 100644 --- a/app/serializers/link.cr +++ b/app/serializers/link.cr @@ -11,8 +11,8 @@ module App::Serializers builder.object do builder.field("id", @link.id) builder.field("link", "#{ENV["APP_URL"]}/#{@link.slug}") - builder.field("clicks", @link.click_counter) builder.field("origin", @link.url) + builder.field("clicks", @link.click_counter) end end end diff --git a/shard.lock b/shard.lock index f249219..2125b7f 100644 --- a/shard.lock +++ b/shard.lock @@ -24,10 +24,6 @@ shards: git: https://github.com/kemalcr/kemal.git version: 1.5.0 - micrate: - git: https://github.com/amberframework/micrate.git - version: 0.3.3 - radix: git: https://github.com/luislavena/radix.git version: 0.4.1 diff --git a/url-shortener.cr b/url-shortener.cr index eaf1604..b4c888f 100644 --- a/url-shortener.cr +++ b/url-shortener.cr @@ -7,9 +7,8 @@ require "./app/serializers/*" require "./app/routes" -error 500 { |env| {"status" => 500, "error" => "Internal Server Error"}.to_json } -error 401 { |env| {"status" => 401, "error" => "Unauthorized"}.to_json } -error 403 { |env| {"status" => 403, "error" => "Forbidden"}.to_json } -error 404 { |env| {"status" => 404, "error" => "Not Found"}.to_json } +error 500 { |env| {"error" => "Internal Server Error"}.to_json } +error 401 { |env| {"error" => "Unauthorized"}.to_json } +error 403 { |env| {"error" => "Forbidden"}.to_json } Kemal.run