Advertisement
Guest User

Untitled

a guest
Apr 24th, 2017
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Clojure 12.11 KB | None | 0 0
  1. (ns mymymy.controllers.team
  2.   (:require [clojure.tools.logging :as log]
  3.             [clojure.set :as set]
  4.             [clojure.string :as string]
  5.             [taoensso.tufte
  6.              :refer [defnp]])
  7.   (:require [mymymy.models.teams :as teams]
  8.             [mymymy.models.channel-members :as channel-members]
  9.             [mymymy.models.users :as users]
  10.             [mymymy.models.channels :as channels]
  11.             [mymymy.models.events :as events]
  12.             [mymymy.services.nimbus :as nimbus]
  13.             [mymymy.models.messages2 :as messages2]
  14.             [mymymy.models.virtual-channels :as vchannels]
  15.             [mymymy.models.admins :as admins]
  16.             [mymymy.models.team-accounts :as mta]
  17.             [mymymy.models.rss :as rss]
  18.             [mymymy.database :as db]
  19.             [mymymy.context :as context]
  20.             [mymymy.acl :as acl]
  21.             [mymymy.deployment :as d]
  22.             [mymymy.controllers.team-account :as cta]
  23.             [mymymy.controllers.push :as push]
  24.             [mymymy.controllers.channel :as channel]
  25.             [mymymy.controllers.message2 :as message2]
  26.             [mymymy.controllers.team :as team]
  27.             [mymymy.controllers.user :as user]
  28.             [mymymy.controllers.aws :as aws]
  29.             [mymymy.corelib.utils :as u
  30.              :refer [nil-or-empty? def-seq-n now-long]]
  31.             [mymymy.corelib.token :as token]
  32.             [mymymy.views.email :as email]
  33.             [mymymy.config :as config]
  34.             [mymymy.runtime :as rt]
  35.             [mymymy.corelib.helper-controller :refer :all]
  36.             [mymymy.corelib.cookie :as cookie]
  37.             [mymymy.corelib.request :as request]
  38.             [mymymy.corelib.resource :as resource]
  39.             [mymymy.corelib.pinyin :as pinyin]
  40.             [mymymy.corelib.dictionary :as dic]
  41.             [mymymy.corelib.reserved :as reserved]
  42.             [mymymy.modules.sms.notifications :as sms-notifications]
  43.             [mymymy.corelib.verification :as verification]))
  44.  
  45. (def should-save-intermediate-password-in-text? (rt/on :dev :test))
  46.  
  47. (defhandler find-domain
  48.   [identity code]
  49.   {:pre-check [(some nil-or-empty? [identity code])
  50.                (dic/get-message :param-required)
  51.  
  52.                (and (not (u/legal-mobile? identity))
  53.                     (not (u/legal-email? identity)))
  54.                (dic/get-message :param-error)]}
  55.   (let [type :retrieve-team
  56.         team-id nil ; no team-id is available at the moment
  57.         code-verified? (= (str code)
  58.                           (verification/get-code team-id type identity))]
  59.     (if code-verified?
  60.       (let [infos (cond ; domains to be fetched
  61.                     (u/legal-email? identity)
  62.                     (users/gets-team-user-by-email identity)
  63.  
  64.                     (u/legal-mobile? identity)
  65.                     (users/gets-team-user-by-mobile identity)
  66.  
  67.                     :default nil)]
  68.         (if-not (u/nil-or-empty? infos)
  69.           (->> infos
  70.                (mapv (fn [{:keys [team-name subdomain logo_url team_id] :as info}]
  71.                        {:name team-name
  72.                         :domain (request/build-team-domain subdomain)
  73.                         :avatar logo_url
  74.                         :id team_id}))
  75.                (success))
  76.           (fail 400 account-invalid (dic/get-message :account-invalid))))
  77.       (fail 200 invalid-verification-code (dic/get-message :invalid-verification-code)))))
  78.  
  79. (defn create-team-and-user*
  80.   [subdomain team_name email_domain email user_name password description mobile hide-mobile
  81.    email-verified? mobile-verified? & [from]]
  82.   (let [subdomain (string/lower-case subdomain)
  83.         team (as-> (u/create-kw-map subdomain description email_domain) $
  84.                (assoc $ :name team_name)
  85.                (u/dissoc-if-nil-empty $ [:email_domain :description])
  86.                (teams/create $))
  87.         avatar (users/gen-default-avatar user_name)
  88.         user (-> {:name            user_name
  89.                   :avatar_url      avatar
  90.                   :mobile          mobile
  91.                   :email           email
  92.                   :email_verified  email-verified?
  93.                   :mobile_verified mobile-verified?
  94.                   :password        (u/bcrypt password)
  95.                   :team_id         (:id team)
  96.                   :hide-mobile     hide-mobile
  97.                   :role            :owner}
  98.                  (u/dissoc-if-nil [:hide-mobile])
  99.                  users/create)]
  100.     (teams/set-team-from (:id team) from)
  101.     (context/with-context {:uid (:id user) :team-id (:id team)}
  102.       (team/after-create-team team user)
  103.       [team user])))
  104.  
  105. (defhandler create-team-and-user
  106.   [req subdomain team_name email_domain user_name password description code email mobile from hide_mobile]
  107.   {:pre-check [(some
  108.                  nil-or-empty?
  109.                  [subdomain team_name user_name password code email mobile]) (dic/get-message :param-required)
  110.                (not (u/legal-email? email)) (dic/get-message :illegal-email)
  111.                (not (u/legal-mobile? mobile)) (dic/get-message :illegal-mobile)
  112.                (team/illegal-subdomain? subdomain) (dic/get-message :illegal-subdomain)
  113.                (reserved/reserved-subdomains subdomain) (dic/get-message :team-subdomain-reserved)
  114.                (teams/get-by-subdomain subdomain) (dic/get-message :team-subdomain-taken)
  115.                (reserved/reserved-email-domains email_domain) (dic/get-message :email-domain-reserved)
  116.                (and (not (string/blank? email_domain))
  117.                     (not (u/legal-email-domain? email_domain))) (dic/get-message :illegal-email-domain)
  118.                (reserved/username-reserved? user_name) (dic/get-message :username-reserved)
  119.                (not (u/legal-name? user_name)) (dic/get-message :illegal-name)]}
  120.  
  121.   (let [team-id nil ; team not created yet.
  122.         type :create-team
  123.         code (str code)
  124.         email-verified? (= code (verification/get-code team-id type email))
  125.         mobile-verified? (= code (verification/get-code team-id type mobile))
  126.         hide-mobile (users/parse-hide-mobile hide_mobile)]
  127.     (if (or mobile-verified? email-verified?)
  128.       (let [[team user] (create-team-and-user* subdomain team_name email_domain
  129.                                                email user_name password description mobile hide-mobile
  130.                                                email-verified? mobile-verified? from)
  131.             uid (:id user)
  132.             identity (if email-verified? email mobile)]
  133.         (verification/delete-code team-id type identity) ;; this nil team-id is verification code related
  134.         (cookie/add-cookie req (success user) (:id team) uid))
  135.       (fail 200 invalid-verification-code (dic/get-message :invalid-verification-code)))))
  136.  
  137. (defn- gen-random-passwd
  138.   []
  139.   (+ 100000 (rand-int 900000)))
  140.  
  141. (defn- notify-invited-users
  142.   [uid admin team subdomain role channels identities]
  143.   (let [{team-id :id team-name :name :keys [logo_url]} team
  144.         invitee-base {:inviter-id uid
  145.                       :team-id team-id
  146.                       :role role
  147.                       :channels channels}]
  148.     (for [identity identities]
  149.       (let [rand-passwd (str (gen-random-passwd))
  150.             invitee-info (merge invitee-base {:password (u/bcrypt rand-passwd)
  151.                                               :identity identity})]
  152.         ;; save to team invitee list to help admin management
  153.         (teams/save-invitee team-id identity)
  154.         ;; save invite info to help user login
  155.         (users/save-intermediate-user invitee-info)
  156.         (cond (u/legal-mobile? identity)
  157.               (sms-notifications/send-sms-notification {:type :admin-invite-user
  158.                                                         :subdomain subdomain
  159.                                                         :mobile identity
  160.                                                         :password rand-passwd
  161.                                                         :admin admin})
  162.               (u/legal-email? identity)
  163.               (email/async-send-invite-email-v2 identity {:subdomain subdomain
  164.                                                           :password rand-passwd
  165.                                                           :team team-name
  166.                                                           :avatar (or logo_url config/teams-default-logo-url)
  167.                                                           :admin admin}))
  168.         ;; retun values when testting
  169.         (when should-save-intermediate-password-in-text?
  170.           {:account identity
  171.            :password rand-passwd})))))
  172.  
  173. (defhandler invite-other
  174.   [req uid team-id subdomain accounts role channels]
  175.   {:pre-check [(some nil-or-empty? [subdomain accounts]) (dic/get-message :param-required)]}
  176.   (let [user (users/get-by-id uid)
  177.         team (teams/get-by-id team-id)
  178.         accounts (->> (string/split accounts #"\s*,\s*")
  179.                       set)
  180.         legal-emails (set (filter u/legal-email? accounts))
  181.         legal-mobiles (->> (set/difference accounts legal-emails)
  182.                            (filter u/legal-mobile?)
  183.                            set)
  184.         illegal-accounts (set/difference accounts (set/union legal-emails legal-mobiles))
  185.         taken-emails (delay (filter (partial users/get-by-team-id-email team-id) legal-emails))
  186.         taken-mobiles (delay (filter (partial users/get-by-team-id-mobile team-id) legal-mobiles))]
  187.  
  188.     (cond (< 20 (count accounts))
  189.           (fail 400 invite-too-many-same-time-code (dic/get-message :invite-too-many-same-time))
  190.  
  191.           (pos? (count illegal-accounts))
  192.           (fail 400 email-or-mobile-illegal-code (-> (string/join "," illegal-accounts)
  193.                                                      (str " " (dic/get-message :email-or-mobile-illegal))))
  194.  
  195.           (seq @taken-emails)
  196.           (fail 400 email-is-taken-code (-> (string/join "," @taken-emails)
  197.                                             (str " " (dic/get-message :email-taken))))
  198.  
  199.           (seq @taken-mobiles)
  200.           (fail 400 mobile-is-taken-code (-> (string/join "," @taken-mobiles)
  201.                                              (str " " (dic/get-message :mobile-taken))))
  202.  
  203.           (not (team/user-unreach-quota-limit? team-id role))
  204.           (team/fail-user-reach-quota-limit team-id role)
  205.  
  206.           (and (= "visitor" role)
  207.                (string/blank? channels))
  208.           (fail 400 param-error-code (dic/get-message :param-required))
  209.  
  210.           :default
  211.           (let [identities (map string/lower-case (concat legal-mobiles legal-emails))
  212.                 admin (:name user)]
  213.             (-> (notify-invited-users uid admin team subdomain role channels identities)
  214.                 success)))))
  215.  
  216. (defhandler get-invitations
  217.   "data format:
  218.  {:account \"email or mobile\"
  219.   :role \"normal or visitor\"
  220.   :channels [encoded channel ids]"
  221.   [team-id]
  222.   (let [old-invitees (->> (teams/gets-invited-emails-with-info team-id)
  223.                           (mapv (fn [{:keys [email] :as info}]
  224.                                   ;; transform old invitee email key to identity key
  225.                                   (merge (select-keys info [:role :channels])
  226.                                          {:account email}))))
  227.         new-invitees (->> (teams/gets-invitee-list team-id)
  228.                           (mapv (fn [{:keys [identity]}]
  229.                                   (when-let [info (users/get-intermediate-user
  230.                                                    {:team-id team-id :identity identity})]
  231.                                     (merge (select-keys info [:role :channels])
  232.                                            {:account identity})))))]
  233.     (->> (concat old-invitees new-invitees)
  234.          (filter identity)
  235.          success)))
  236.  
  237. (defhandler del-one-invitation
  238.   [team-id account]
  239.   {:pre-check [(nil-or-empty? account) (dic/get-message :param-required)]}
  240.   ;; this is for old invitee
  241.   (when (u/legal-email? account)
  242.     (team/del-one-invitation* team-id account))
  243.   ;; this is for new invitee
  244.   (let [m {:team-id team-id
  245.            :identity account}]
  246.     (teams/del-invitee team-id account)
  247.     (users/delete-intermediate-user m))
  248.   (success))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement