     
     true)) ; no existing entry, so this will fail existence check later
 
+(defn- valid-follow-up-request? [conn entry-uuid follow-up-map user]
+  (let [existing-entry (entry-res/get-entry conn entry-uuid)
+        ts (db-common/current-timestamp)
+        with-keys (keywordize-keys follow-up-map)
+        self? (:self with-keys)
+        assignees (if self?
+                    [(lib-schema/author-for-user user)]
+                    (:assignees with-keys))
+        follow-ups (map #(hash-map :assignee %
+                                  :uuid (db-common/unique-id)
+                                  :created-at ts
+                                  :author (lib-schema/author-for-user user)
+                                  :completed? false)
+                         assignees)]
+    (if existing-entry
+      (if (every? #(lib-schema/valid? common-res/FollowUp %) follow-ups)
+        {:existing-entry (api-common/rep existing-entry)
+         :self? self?
+         :follow-ups (api-common/rep follow-ups)}
+        [false, {:follow-ups (api-common/rep follow-ups)}]) ; invalid share request
+      true))) ;; wil fail existence later
+
 (defn- entry-list-for-board
   "Retrieve an entry list for the board, or false if the org or board doesn't exist."
   [conn org-slug board-slug-or-uuid ctx]

                          :post (fn [ctx] (api-common/known-content-type? ctx mt/share-request-media-type))})

  ;; Data handling
  :new? false 
  :respond-with-entity? true

  ;; Validations

      {:updated-entry (api-common/rep update-result)})
    (do
      (timbre/error "Failed sharing entry:" entry-for) false)))

(defn- create-follow-ups [conn ctx entry-for]
  (timbre/info "Creating " (count (:follow-ups ctx)) " follow-ups for entry:" entry-for)
  (if-let* [org (:existing-org ctx)
            board (:existing-board ctx)
            entry (:existing-entry ctx)
            user (:user ctx)
            follow-ups (:follow-ups ctx)
            updated-entry (entry-res/add-follow-ups! conn entry follow-ups user)
            entry-with-comments (assoc entry :existing-comments (entry-res/list-comments-for-entry conn (:uuid entry)))]
    (do
      ;; TODO: Trigger notifications for created follow-ups
      ;; (when (and (seq? follow-ups) (any? follow-ups)))
      (timbre/info "Follow-ups created for entry:" entry-for)
      {:updated-entry (api-common/rep updated-entry)})
    (do
      (timbre/error "Failed creating follow-ups for entry:" entry-for) false)))

(defn- mark-complete-follow-up [conn ctx entry-for]
  (timbre/info "Marking complete follow-up " (:uuid (:existing-follow-up ctx)) " for entry:" entry-for)
  (if-let* [org (:existing-org ctx)
            board (:existing-board ctx)
            entry (:existing-entry ctx)
            follow-up (:existing-follow-up ctx)
            user (:user ctx)
            updated-entry (entry-res/complete-follow-up! conn entry follow-up user)
            entry-with-comments (assoc entry :existing-comments (entry-res/list-comments-for-entry conn (:uuid entry)))]
    (do
      ;; TODO: Trigger notifications for completed follow-up
      (timbre/info "Follow-up marked complete for entry:" entry-for)
      {:updated-entry (api-common/rep updated-entry)})
    (do
      (timbre/error "Failed marking complete follow-up for entry:" entry-for) false)))

(defn auto-share-on-publish
  [conn ctx entry-result]
