|
7 | 7 | [cmr.acl.core :as acl]
|
8 | 8 | [cmr.common-app.api.enabled :as common-enabled]
|
9 | 9 | [cmr.common-app.api.launchpad-token-validation :as lt-validation]
|
| 10 | + [cmr.common-app.services.ingest.subscription-common :as sub-common] |
10 | 11 | [cmr.common.log :refer [debug info warn error]]
|
11 | 12 | [cmr.common.services.errors :as errors]
|
12 | 13 | [cmr.ingest.api.core :as api-core]
|
13 | 14 | [cmr.ingest.services.ingest-service :as ingest]
|
| 15 | + [cmr.ingest.services.subscriptions-helper :as jobs] |
14 | 16 | [cmr.ingest.validation.validation :as v]
|
15 | 17 | [cmr.transmit.access-control :as access-control]
|
16 | 18 | [cmr.transmit.metadata-db :as mdb]
|
| 19 | + [cmr.transmit.metadata-db2 :as mdb2] |
17 | 20 | [cmr.transmit.urs :as urs])
|
18 | 21 | (:import
|
19 | 22 | [java.util UUID]))
|
|
57 | 60 | subscriber-id
|
58 | 61 | concept-id)))))
|
59 | 62 |
|
| 63 | +(defn- check-duplicate-subscription |
| 64 | + "The query used by a subscriber for a collection should be unique to prevent |
| 65 | + redundent emails from being sent to them. This function will check that a |
| 66 | + subscription is unique for the following conditions: native-id, collection-id, |
| 67 | + subscriber-id, normalized-query." |
| 68 | + [request-context subscription] |
| 69 | + (let [native-id (:native-id subscription) |
| 70 | + provider-id (:provider-id subscription) |
| 71 | + metadata (-> (:metadata subscription) (json/decode true)) |
| 72 | + normalized-query (:normalized-query subscription) |
| 73 | + collection-id (:CollectionConceptId metadata) |
| 74 | + subscriber-id (:SubscriberId metadata) |
| 75 | + ;; Find concepts with matching collection-concept-id, normalized-query, and subscriber-id |
| 76 | + duplicate-queries (mdb/find-concepts |
| 77 | + request-context |
| 78 | + {:collection-concept-id collection-id |
| 79 | + :normalized-query normalized-query |
| 80 | + :subscriber-id subscriber-id |
| 81 | + :exclude-metadata true |
| 82 | + :latest true} |
| 83 | + :subscription) |
| 84 | + ;;we only want to look at non-deleted subscriptions |
| 85 | + active-duplicate-queries (remove :deleted duplicate-queries)] |
| 86 | + ;;If there is at least one duplicate subscription, |
| 87 | + ;;We need to make sure it has the same native-id, or else reject the ingest |
| 88 | + (when (and (> (count active-duplicate-queries) 0) |
| 89 | + (every? #(not= native-id (:native-id %)) active-duplicate-queries)) |
| 90 | + (errors/throw-service-error |
| 91 | + :conflict |
| 92 | + (format (str "The subscriber-id [%s] has already subscribed to the " |
| 93 | + "collection with concept-id [%s] using the query [%s]. " |
| 94 | + "Subscribers must use unique queries for each Collection.") |
| 95 | + subscriber-id collection-id normalized-query))))) |
| 96 | + |
60 | 97 | (defn- get-subscriber-id
|
61 | 98 | "Returns the subscriber id of the given subscription concept by parsing its metadata."
|
62 | 99 | [sub-concept]
|
|
154 | 191 | (get-unique-native-id context subscription))
|
155 | 192 | native-id)))
|
156 | 193 |
|
157 |
| -(defn- add-id-and-email-to-metadata-if-missing |
| 194 | +(defn- add-id-to-metadata-if-missing |
158 | 195 | "If SubscriberId is provided, use it. Else, get it from the token."
|
159 | 196 | [context metadata]
|
160 |
| - (let [{subscriber :SubscriberId} metadata |
161 |
| - subscriber (if-not subscriber |
| 197 | + (let [subscriber-id (:SubscriberId metadata) |
| 198 | + subscriber (if-not subscriber-id |
162 | 199 | (api-core/get-user-id-from-token context)
|
163 |
| - subscriber)] |
| 200 | + subscriber-id)] |
164 | 201 | (assoc metadata :SubscriberId subscriber)))
|
165 | 202 |
|
166 |
| - |
167 |
| -(defn add-id-and-email-if-missing |
168 |
| - "Parses and generates the metadata, such that add-id-and-email-to-metadata-if-missing |
169 |
| - can focus on insertion logic." |
| 203 | +(defn- add-fields-if-missing |
| 204 | + "Parses and generates the metadata, such that add-id-to-metadata-if-missing |
| 205 | + can focus on insertion logic. Also adds normalized-query to the concept." |
170 | 206 | [context subscription]
|
171 | 207 | (let [metadata (json/parse-string (:metadata subscription) true)
|
172 |
| - new-metadata (add-id-and-email-to-metadata-if-missing context metadata)] |
173 |
| - (assoc subscription :metadata (json/generate-string new-metadata)))) |
| 208 | + new-metadata (add-id-to-metadata-if-missing context metadata) |
| 209 | + normalized (sub-common/normalize-parameters (:Query metadata))] |
| 210 | + (assoc subscription |
| 211 | + :metadata (json/generate-string new-metadata) |
| 212 | + :normalized-query normalized))) |
174 | 213 |
|
175 | 214 | (defn create-subscription
|
176 | 215 | "Processes a request to create a subscription. A native id will be generated."
|
|
186 | 225 | headers)
|
187 | 226 | native-id (get-unique-native-id request-context tmp-subscription)
|
188 | 227 | new-subscription (assoc tmp-subscription :native-id native-id)
|
189 |
| - newer-subscription (add-id-and-email-if-missing request-context new-subscription) |
| 228 | + newer-subscription (add-fields-if-missing request-context new-subscription) |
190 | 229 | subscriber-id (get-subscriber-id newer-subscription)]
|
191 | 230 | (check-ingest-permission request-context provider-id subscriber-id)
|
| 231 | + (check-duplicate-subscription request-context newer-subscription) |
192 | 232 | (perform-subscription-ingest request-context newer-subscription headers))))
|
193 | 233 |
|
194 | 234 | (defn create-subscription-with-native-id
|
|
209 | 249 | body
|
210 | 250 | content-type
|
211 | 251 | headers)
|
212 |
| - new-subscription (add-id-and-email-if-missing request-context tmp-subscription) |
| 252 | + new-subscription (add-fields-if-missing request-context tmp-subscription) |
213 | 253 | subscriber-id (get-subscriber-id new-subscription)]
|
214 | 254 | (check-ingest-permission request-context provider-id subscriber-id)
|
| 255 | + (check-duplicate-subscription request-context new-subscription) |
215 | 256 | (perform-subscription-ingest request-context new-subscription headers))))
|
216 | 257 |
|
217 | 258 | (defn create-or-update-subscription-with-native-id
|
|
236 | 277 | :latest true}
|
237 | 278 | :subscription))]
|
238 | 279 | (get-in original-subscription [:extra-fields :subscriber-id]))
|
239 |
| - new-subscription (add-id-and-email-if-missing request-context tmp-subscription) |
| 280 | + new-subscription (add-fields-if-missing request-context tmp-subscription) |
240 | 281 | new-subscriber (get-subscriber-id new-subscription)]
|
241 | 282 | (check-ingest-permission request-context provider-id new-subscriber old-subscriber)
|
| 283 | + (check-duplicate-subscription request-context new-subscription) |
242 | 284 | (perform-subscription-ingest request-context new-subscription headers)))
|
243 | 285 |
|
244 | 286 | (defn delete-subscription
|
|
0 commit comments