0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-04-09 21:41:23 -05:00

feat(backend): port auth kvstore and svg handlers

This commit is contained in:
Andrey Antukh 2019-06-15 23:55:27 +02:00
parent 4291c80259
commit f357180564
4 changed files with 152 additions and 20 deletions

View file

@ -6,16 +6,22 @@
(ns uxbox.api
(:require [mount.core :refer [defstate]]
[uxbox.config :as cfg]
[muuntaja.core :as m]
[ring.adapter.jetty :as jetty]
[reitit.ring :as ring]
[uxbox.api.middleware :refer [handler router-options]]
[reitit.dev.pretty :as pretty]
[uxbox.config :as cfg]
[uxbox.api.middleware :refer [handler middleware authorization-middleware]]
[uxbox.api.auth :as api-auth]
[uxbox.api.pages :as api-pages]
[uxbox.api.users :as api-users]
[uxbox.api.icons :as api-icons]
[uxbox.api.images :as api-images]
[uxbox.api.projects :as api-projects]))
[uxbox.api.kvstore :as api-kvstore]
[uxbox.api.projects :as api-projects]
[uxbox.api.svg :as api-svg]
[uxbox.util.transit :as t]))
;; --- Top Level Handlers
@ -33,15 +39,40 @@
;; --- Routes
(def ^:private muuntaja-instance
(m/create (update-in m/default-options [:formats "application/transit+json"]
merge {:encoder-opts {:handlers t/+write-handlers+}
:decoder-opts {:handlers t/+read-handlers+}})))
(def ^:private router-options
{;;:reitit.middleware/transform dev/print-request-diffs
:exception pretty/exception
:data {:muuntaja muuntaja-instance
:middleware middleware}})
(def routes
(ring/router
[["/media/*" (ring/create-resource-handler {:root "public/media"})]
["/static/*" (ring/create-resource-handler {:root "public/static"})]
["/auth/login" {:post (handler #'api-auth/login)}]
["/auth"
["/login" {:post (handler #'api-auth/login)}]
["/register" {:post (handler #'api-auth/register)}]
["/recovery/:token" {:get (handler #'api-auth/register)}]
["/recovery" {:post (handler #'api-auth/request-recovery)
:get (handler #'api-auth/recover-password)}]]
["/api" {:middleware [api-auth/authorization-middleware]}
["/api" {:middleware [authorization-middleware]}
["/echo" (handler #'welcome-api)]
;; KVStore
["/kvstore/:key" {:put (handler #'api-kvstore/upsert)
:get (handler #'api-kvstore/retrieve)
:delete (handler #'api-kvstore/delete)}]
["/svg/parse" {:post (handler #'api-svg/parse)}]
;; Projects
["/projects" {:get (handler #'api-projects/list)
:post (handler #'api-projects/create)}]
["/projects/by-token/:token" {:get (handler #'api-projects/get-by-share-token)}]

View file

@ -6,6 +6,7 @@
(ns uxbox.api.auth
(:require [clojure.spec.alpha :as s]
[promesa.core :as p]
[struct.core :as st]
[uxbox.services :as sv]
[uxbox.util.http :as http]
@ -18,19 +19,47 @@
:password [st/required st/string]
:scope [st/required st/string]}}}
[ctx]
(let [data (get-in ctx [:parameters :body])
user @(sv/novelty (assoc data :type :login))]
(-> (http/no-content)
(assoc :session {:user-id (get user :id)}))))
(let [data (get-in ctx [:parameters :body])]
(->> (sv/novelty (assoc data :type :login))
(p/map (fn [{:keys [id] :as user}]
(-> (http/no-content)
(assoc :session {:user-id id})))))))
(defn authorization-middleware
[handler]
(fn
([request]
(if-let [identity (get-in request [:session :user-id])]
(handler (assoc request :identity identity :user identity))
(http/forbidden nil)))
([request respond raise]
(if-let [identity (get-in request [:session :user-id])]
(handler (assoc request :identity identity :user identity) respond raise)
(respond (http/forbidden nil))))))
(defn register
{:parameters {:body {:username [st/required st/string]
:email [st/required st/email]
:password [st/required st/string]
:fullname [st/required st/string]}}}
[{:keys [parameters]}]
(let [data (get parameters :body)
message (assoc data :type :register-profile)]
(->> (sv/novelty message)
(p/map http/ok))))
(defn request-recovery
{:parameters {:body {:username [st/required st/string]}}}
[{:keys [parameters]}]
(let [data (get parameters :body)
message (assoc data :type :request-profile-password-recovery)]
(->> (sv/novelty message)
(p/map (constantly (http/no-content))))))
(defn recover-password
{:parameters {:body {:token [st/required st/string]
:password [st/required st/string]}}}
[{:keys [parameters]}]
(let [data (get parameters :body)
message (assoc data :type :recover-profile-password)]
(->> (sv/novelty message)
(p/map (constantly (http/no-content))))))
(defn validate-recovery-token
{:parameters {:path {:token [st/required st/string]}}}
[{:keys [parameters]}]
(let [message {:type :validate-profile-password-recovery-token
:token (get-in parameters [:path :token])}]
(->> (sv/query message)
(p/map (fn [v]
(if v
(http/no-content)
(http/not-found "")))))))

View file

@ -0,0 +1,53 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) 2019 Andrey Antukh <niwi@niwi.nz>
(ns uxbox.api.kvstore
(:refer-clojure :exclude [update])
(:require [struct.core :as st]
[promesa.core :as p]
[uxbox.services :as sv]
[uxbox.media :as media]
[uxbox.util.http :as http]
[uxbox.util.spec :as us]
[uxbox.util.uuid :as uuid]))
(defn retrieve
{:parameters {:path {:key [st/required st/string]}}}
[{:keys [user parameters] }]
(let [key (get-in parameters [:path :key])
message {:key key
:type :retrieve-kvstore
:user user}]
(->> (sv/query message)
(p/map http/ok))))
(defn upsert
{:parameters {:path {:key [st/required st/string]}
:body {:value [st/required]
:version [st/number]}}}
[{:keys [user parameters]}]
(let [value (get-in parameters [:body :value])
key (get-in parameters [:path :key])
version (get-in parameters [:body :version])
message {:key key
:version version
:value value
:type :update-kvstore
:user user}]
(->> (sv/novelty message)
(p/map http/ok))))
(defn delete
{:parameters {:path {:key [st/required st/string]}}}
[{:keys [user parameters]}]
(let [key (get-in parameters [:path :key])
message {:key key
:type :delete-kvstore
:user user}]
(->> (sv/novelty message)
(p/map (constantly (http/no-content))))))

View file

@ -0,0 +1,19 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) 2016 Andrey Antukh <niwi@niwi.nz>
(ns uxbox.api.svg
(:require [promesa.core :as p]
[uxbox.util.spec :as us]
[uxbox.services :as sv]
[uxbox.util.http :as http]
[uxbox.util.uuid :as uuid]))
(defn parse
[{:keys [body] :as req}]
(let [message {:data (slurp body)
:type :parse-svg}]
(->> (sv/query message)
(p/map http/ok))))