mirror of
https://github.com/hkalexling/Mango.git
synced 2026-04-05 00:00:44 -04:00
Finish the API endpoint for cover upload
This commit is contained in:
25
src/handlers/auth_handler.cr
Normal file
25
src/handlers/auth_handler.cr
Normal file
@@ -0,0 +1,25 @@
|
||||
require "kemal"
|
||||
require "../storage"
|
||||
require "../util"
|
||||
|
||||
class AuthHandler < Kemal::Handler
|
||||
def initialize(@storage : Storage)
|
||||
end
|
||||
|
||||
def call(env)
|
||||
return call_next(env) if request_path_startswith env, ["/login", "/logout"]
|
||||
|
||||
cookie = env.request.cookies.find { |c| c.name == "token" }
|
||||
if cookie.nil? || !@storage.verify_token cookie.value
|
||||
return env.redirect "/login"
|
||||
end
|
||||
|
||||
if request_path_startswith env, ["/admin", "/api/admin", "/download"]
|
||||
unless @storage.verify_admin cookie.value
|
||||
env.response.status_code = 403
|
||||
end
|
||||
end
|
||||
|
||||
call_next env
|
||||
end
|
||||
end
|
||||
26
src/handlers/log_handler.cr
Normal file
26
src/handlers/log_handler.cr
Normal file
@@ -0,0 +1,26 @@
|
||||
require "kemal"
|
||||
require "../logger"
|
||||
|
||||
class LogHandler < Kemal::BaseLogHandler
|
||||
def initialize(@logger : Logger)
|
||||
end
|
||||
|
||||
def call(env)
|
||||
elapsed_time = Time.measure { call_next env }
|
||||
elapsed_text = elapsed_text elapsed_time
|
||||
msg = "#{env.response.status_code} #{env.request.method}" \
|
||||
" #{env.request.resource} #{elapsed_text}"
|
||||
@logger.debug msg
|
||||
env
|
||||
end
|
||||
|
||||
def write(msg)
|
||||
@logger.debug msg
|
||||
end
|
||||
|
||||
private def elapsed_text(elapsed)
|
||||
millis = elapsed.total_milliseconds
|
||||
return "#{millis.round(2)}ms" if millis >= 1
|
||||
"#{(millis * 1000).round(2)}µs"
|
||||
end
|
||||
end
|
||||
32
src/handlers/static_handler.cr
Normal file
32
src/handlers/static_handler.cr
Normal file
@@ -0,0 +1,32 @@
|
||||
require "baked_file_system"
|
||||
require "kemal"
|
||||
require "../util"
|
||||
|
||||
class FS
|
||||
extend BakedFileSystem
|
||||
{% if flag?(:release) %}
|
||||
{% if read_file? "#{__DIR__}/../../dist/favicon.ico" %}
|
||||
{% puts "baking ../../dist" %}
|
||||
bake_folder "../../dist"
|
||||
{% else %}
|
||||
{% puts "baking ../../public" %}
|
||||
bake_folder "../../public"
|
||||
{% end %}
|
||||
{% end %}
|
||||
end
|
||||
|
||||
class StaticHandler < Kemal::Handler
|
||||
@dirs = ["/css", "/js", "/img", "/favicon.ico"]
|
||||
|
||||
def call(env)
|
||||
if request_path_startswith env, @dirs
|
||||
file = FS.get? env.request.path
|
||||
return call_next env if file.nil?
|
||||
|
||||
slice = Bytes.new file.size
|
||||
file.read slice
|
||||
return send_file env, slice, file.mime_type
|
||||
end
|
||||
call_next env
|
||||
end
|
||||
end
|
||||
28
src/handlers/upload_handler.cr
Normal file
28
src/handlers/upload_handler.cr
Normal file
@@ -0,0 +1,28 @@
|
||||
require "kemal"
|
||||
require "../util"
|
||||
|
||||
class UploadHandler < Kemal::Handler
|
||||
def initialize(@upload_dir : String)
|
||||
end
|
||||
|
||||
def call(env)
|
||||
unless request_path_startswith(env, [UPLOAD_URL_PREFIX]) &&
|
||||
env.request.method == "GET"
|
||||
return call_next env
|
||||
end
|
||||
|
||||
pp env.request.path
|
||||
|
||||
ary = env.request.path.split(File::SEPARATOR).select { |part| !part.empty? }
|
||||
ary[0] = @upload_dir
|
||||
path = File.join ary
|
||||
|
||||
pp path
|
||||
|
||||
if File.exists? path
|
||||
send_file env, path
|
||||
else
|
||||
env.response.status_code = 404
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user