From b7b47b133d47142020d63928c223484e43461b03 Mon Sep 17 00:00:00 2001 From: Juan Rodriguez Date: Sun, 12 May 2024 21:25:57 +0200 Subject: [PATCH] feat: ping route + controller --- .env.development | 1 + shard.lock | 24 ++++++++++++++++++++++ shard.yml | 18 +++++++++++++--- spec/{url-shortener_spec.cr => pa_spec.cr} | 0 spec/spec_helper.cr | 2 +- src/config/env.cr | 6 ++++++ src/config/kemal.cr | 5 +++++ src/controllers/ping.cr | 10 +++++++++ src/lib/controller.cr | 4 ++++ src/pa.cr | 10 +++++++++ src/routes.cr | 8 ++++++++ src/services/database.cr | 16 +++++++++++++++ src/url-shortener.cr | 7 ------- src/version.cr | 3 +++ 14 files changed, 103 insertions(+), 11 deletions(-) create mode 100644 .env.development rename spec/{url-shortener_spec.cr => pa_spec.cr} (100%) create mode 100644 src/config/env.cr create mode 100644 src/config/kemal.cr create mode 100644 src/controllers/ping.cr create mode 100644 src/lib/controller.cr create mode 100644 src/pa.cr create mode 100644 src/routes.cr create mode 100644 src/services/database.cr delete mode 100644 src/url-shortener.cr create mode 100644 src/version.cr diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..6cf8383 --- /dev/null +++ b/.env.development @@ -0,0 +1 @@ +DATABASE_URL=./sqlite/db.sqlite diff --git a/shard.lock b/shard.lock index 0805cb9..f249219 100644 --- a/shard.lock +++ b/shard.lock @@ -4,6 +4,18 @@ shards: git: https://github.com/sija/backtracer.cr.git version: 1.2.2 + crecto: + git: https://github.com/fridgerator/crecto.git + version: 0.12.1 + + db: + git: https://github.com/crystal-lang/crystal-db.git + version: 0.13.1 + + dotenv: + git: https://github.com/gdotdesign/cr-dotenv.git + version: 0.6.0 + exception_page: git: https://github.com/crystal-loot/exception_page.git version: 0.4.1 @@ -12,7 +24,19 @@ 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 + spec-kemal: + git: https://github.com/kemalcr/spec-kemal.git + version: 0.5.0 + + sqlite3: + git: https://github.com/crystal-lang/crystal-sqlite3.git + version: 0.21.0 + diff --git a/shard.yml b/shard.yml index fc9d429..b0cc4af 100644 --- a/shard.yml +++ b/shard.yml @@ -1,16 +1,28 @@ -name: url-shortener +name: pa version: 0.1.0 authors: - Juan Rodriguez targets: - url-shortener: - main: src/url-shortener.cr + pa: + main: src/pa.cr dependencies: kemal: github: kemalcr/kemal + sqlite3: + github: crystal-lang/crystal-sqlite3 + crecto: + github: fridgerator/crecto + micrate: + github: amberframework/micrate + +development_dependencies: + dotenv: + github: gdotdesign/cr-dotenv + spec-kemal: + github: kemalcr/spec-kemal crystal: '>= 1.12.1' diff --git a/spec/url-shortener_spec.cr b/spec/pa_spec.cr similarity index 100% rename from spec/url-shortener_spec.cr rename to spec/pa_spec.cr diff --git a/spec/spec_helper.cr b/spec/spec_helper.cr index c8fda01..d022140 100644 --- a/spec/spec_helper.cr +++ b/spec/spec_helper.cr @@ -1,2 +1,2 @@ require "spec" -require "../src/url-shortener" +require "../src/pa" diff --git a/src/config/env.cr b/src/config/env.cr new file mode 100644 index 0000000..9b944b8 --- /dev/null +++ b/src/config/env.cr @@ -0,0 +1,6 @@ +ENV["APP_ENV"] ||= "development" + +{% if env("APP_ENV") != "production" %} + require "dotenv" + Dotenv.load ".env.#{ENV["APP_ENV"]}" # File must exist in non-production! +{% end %} diff --git a/src/config/kemal.cr b/src/config/kemal.cr new file mode 100644 index 0000000..3c49d66 --- /dev/null +++ b/src/config/kemal.cr @@ -0,0 +1,5 @@ +require "kemal" + +Kemal.config.env = ENV["ENV"]? || "development" +Kemal.config.port = ENV["PORT"]?.try(&.to_i) || 3000 +Kemal.config.host_binding = ENV["HOST"]? || "0.0.0.0" diff --git a/src/controllers/ping.cr b/src/controllers/ping.cr new file mode 100644 index 0000000..447e9b2 --- /dev/null +++ b/src/controllers/ping.cr @@ -0,0 +1,10 @@ +require "../lib/controller.cr" + +module Pa::Controllers::Ping + class Get < Pa::Lib::BaseController + def call(env) + response = {"pong" => "ok"} + response.to_json + end + end +end diff --git a/src/lib/controller.cr b/src/lib/controller.cr new file mode 100644 index 0000000..bb3bd02 --- /dev/null +++ b/src/lib/controller.cr @@ -0,0 +1,4 @@ +module Pa::Lib + abstract class BaseController + end +end diff --git a/src/pa.cr b/src/pa.cr new file mode 100644 index 0000000..005a16e --- /dev/null +++ b/src/pa.cr @@ -0,0 +1,10 @@ +require "./config/*" +require "./services/*" +require "./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 } + +Kemal.run diff --git a/src/routes.cr b/src/routes.cr new file mode 100644 index 0000000..e881fa2 --- /dev/null +++ b/src/routes.cr @@ -0,0 +1,8 @@ +require "kemal" +require "./controllers/**" + +module Pa + get "/api/ping" do |env| + Controllers::Ping::Get.new.call(env) + end +end diff --git a/src/services/database.cr b/src/services/database.cr new file mode 100644 index 0000000..c5977d5 --- /dev/null +++ b/src/services/database.cr @@ -0,0 +1,16 @@ +require "sqlite3" +require "crecto" + +module Pa::Services + class Repo + extend Crecto::Repo + + Query = Crecto::Repo::Query + Multi = Crecto::Repo::Multi + + config do |conf| + conf.adapter = Crecto::Adapters::SQLite3 + conf.database = ENV["DATABASE_URL"] + end + end +end diff --git a/src/url-shortener.cr b/src/url-shortener.cr deleted file mode 100644 index 5559ebe..0000000 --- a/src/url-shortener.cr +++ /dev/null @@ -1,7 +0,0 @@ -require "kemal" - -get "/" do - "Hello World!" -end - -Kemal.run diff --git a/src/version.cr b/src/version.cr new file mode 100644 index 0000000..970a57b --- /dev/null +++ b/src/version.cr @@ -0,0 +1,3 @@ +module Pa + VERSION = "0.1.0" +end