Saves email address and profile photos

This commit is contained in:
Bryce
2023-05-26 22:00:38 -07:00
parent 936a300a05
commit dd5feb260d
6 changed files with 54 additions and 23 deletions

View File

@@ -1758,6 +1758,16 @@
:db/doc "name of the user", :db/doc "name of the user",
:db/ident :user/name, :db/ident :user/name,
} }
{:db/valueType #:db{:ident :db.type/string},
:db/cardinality #:db{:ident :db.cardinality/one},
:db/doc "email address of the user",
:db/ident :user/email,
}
{:db/valueType #:db{:ident :db.type/string},
:db/cardinality #:db{:ident :db.cardinality/one},
:db/doc "profile image of user",
:db/ident :user/profile-image-url,
}
{:db/valueType #:db{:ident :db.type/ref}, {:db/valueType #:db{:ident :db.type/ref},
:db/cardinality #:db{:ident :db.cardinality/many}, :db/cardinality #:db{:ident :db.cardinality/many},
:db/doc "The clients this user can view", :db/doc "The clients this user can view",

View File

@@ -1,7 +1,8 @@
(ns auto-ap.datomic.users (ns auto-ap.datomic.users
(:require (:require
[auto-ap.datomic :refer [conn]] [auto-ap.datomic :refer [conn]]
[datomic.api :as dc])) [datomic.api :as dc]
[datomic.api :as d]))
(defn add-arg [query name value where & rest] (defn add-arg [query name value where & rest]
(let [query (-> query (let [query (-> query
@@ -19,27 +20,27 @@
(map #(update % :user/role :db/ident)) (map #(update % :user/role :db/ident))
first)) first))
(defn find-or-insert! [{:keys [:user/provider :user/provider-id] :as new-user}]
(defn find-or-insert! [{:keys [:user/provider :user/provider-id ] :as new-user}]
(let [is-first-user? (not (seq (dc/q [:find '?e (let [is-first-user? (not (seq (dc/q [:find '?e
:in '$ :in '$
:where '[?e :user/provider]] :where '[?e :user/provider]]
(dc/db conn)))) (dc/db conn))))
user (some-> (dc/q [:find '(pull ?e [* user-id (ffirst (dc/q '[:find ?e
{:user/clients [*]} :in $ ?provider ?provider-id
{:user/role [:db/ident]}]) :where [?e :user/provider ?provider]
:in '$ '?provider '?provider-id [?e :user/provider-id ?provider-id]]
:where '[?e :user/provider ?provider] (dc/db conn) provider provider-id))
'[?e :user/provider-id ?provider-id]] result @(dc/transact conn [[:upsert-entity (cond-> (assoc new-user :db/id (or user-id "user"))
(dc/db conn) provider provider-id) (not user-id) (assoc :user/role :user-role/none)
first is-first-user? (assoc :user/role :user-role/admin))]])
first user-id (or user-id (get-in result [:tempids "user"]))]
(update :user/role :db/ident))] (update (dc/pull (dc/db conn)
(if user '[*
user {:user/clients [*]}
(let [new-user-trans @(dc/transact conn [(cond-> new-user {:user/role [:db/ident]}]
true (assoc :db/id "user") user-id)
is-first-user? (assoc :user/role :user-role/admin))])] :user/role :db/ident)))
(get-by-id (-> new-user-trans :tempids (get "user")))))))
(defn raw-graphql [_] (defn raw-graphql [_]
(->> (dc/q {:find ['(pull ?e [* (->> (dc/q {:find ['(pull ?e [*

View File

@@ -236,6 +236,8 @@
:user :user
{:fields {:id {:type :id} {:fields {:id {:type :id}
:name {:type 'String} :name {:type 'String}
:profile_image_url {:type 'String}
:email {:type 'String}
:role {:type :role} :role {:type :role}
:clients {:type '(list :client)}}} :clients {:type '(list :client)}}}

View File

@@ -5,7 +5,8 @@
[clj-http.client :as http] [clj-http.client :as http]
[clj-time.core :as time] [clj-time.core :as time]
[clojure.tools.logging :as log] [clojure.tools.logging :as log]
[config.core :refer [env]])) [config.core :refer [env]]
[com.brunobonacci.mulog :as mu]))
(def google-client-id "264081895820-0nndcfo3pbtqf30sro82vgq5r27h8736.apps.googleusercontent.com") (def google-client-id "264081895820-0nndcfo3pbtqf30sro82vgq5r27h8736.apps.googleusercontent.com")
(def google-client-secret "OC-WemHurPXYpuIw5cT-B90g") (def google-client-secret "OC-WemHurPXYpuIw5cT-B90g")
@@ -30,13 +31,17 @@
"grant_type" "authorization_code"} "grant_type" "authorization_code"}
:as :json}) :as :json})
:body) :body)
token (:access_token auth) token (:access_token auth)
profile (-> (http/get "https://www.googleapis.com/oauth2/v1/userinfo" profile (-> (http/get "https://www.googleapis.com/oauth2/v1/userinfo"
{:headers {"Authorization" (str "Bearer " token)} :as :json}) {:headers {"Authorization" (str "Bearer " token)} :as :json})
:body) :body)
_ (mu/log ::got-profile
:profile profile)
user (users/find-or-insert! {:user/provider "google" user (users/find-or-insert! {:user/provider "google"
:user/provider-id (:id profile) :user/provider-id (:id profile)
:user/role :user-role/none :user/email (:email profile)
:user/profile-image-url (:picture profile)
:user/name (:name profile)}) :user/name (:name profile)})
auth {:user (:name profile) auth {:user (:name profile)
:exp (time/plus (time/now) (time/days 30)) :exp (time/plus (time/now) (time/days 30))
@@ -44,9 +49,10 @@
(select-keys c [:client/code :db/id :client/locations])) (select-keys c [:client/code :db/id :client/locations]))
(:user/clients user)) (:user/clients user))
:user/role (name (:user/role user)) :user/role (name (:user/role user))
:user/profile-image-url (:picture profile)
:user/name (:name profile)} :user/name (:name profile)}
] _ (mu/log ::logged-in-as
(log/info "authenticated as user" user) :auth auth)]
;; TODO - these namespaces are not being transmitted/deserialized properly ;; TODO - these namespaces are not being transmitted/deserialized properly
(if (and token user) (if (and token user)

View File

@@ -37,6 +37,8 @@
:owns-state {:single ::page} :owns-state {:single ::page}
:query-obj {:venia/queries [[:user :query-obj {:venia/queries [[:user
[:name [:name
:profile_image_url
:email
:id :id
:role :role
[:clients [:id :name]]]]]} [:clients [:id :name]]]]]}

View File

@@ -29,6 +29,7 @@
[grid/header [grid/header
[grid/row {} [grid/row {}
[grid/header-cell {} "User"] [grid/header-cell {} "User"]
[grid/header-cell {} "Email"]
[grid/header-cell {} "Role"] [grid/header-cell {} "Role"]
[grid/header-cell {} "Clients"] [grid/header-cell {} "Clients"]
[grid/header-cell {:style {:width (action-cell-width 1)}} ]]] [grid/header-cell {:style {:width (action-cell-width 1)}} ]]]
@@ -36,7 +37,16 @@
(for [{:keys [id name role clients] :as c} (:data page)] (for [{:keys [id name role clients] :as c} (:data page)]
^{:key (str name "-" id )} ^{:key (str name "-" id )}
[grid/row {:class (:class c) :id id} [grid/row {:class (:class c) :id id}
[grid/cell {} name] [grid/cell {}
[:div.level
[:div.level-left
(when-let [url (:profile-image-url c)]
[:div.level-item
[:figure.image.is-24x24
[:img.is-rounded {:src url
:referrer-policy= "no-referrer" }]]])
[:div.level-item name]]]]
[grid/cell {} (:email c)]
[grid/cell {} role] [grid/cell {} role]
[grid/cell {} (str/join ", " (map :name clients))] [grid/cell {} (str/join ", " (map :name clients))]
[grid/cell {} [grid/cell {}