]> git.immae.eu Git - github/bastienwirtz/homer.git/commitdiff
Adds mapping remote field to Homer expected ones when loading message from url
authorluixal <luixal@gmail.com>
Mon, 4 Jan 2021 08:43:58 +0000 (09:43 +0100)
committerluixal <luixal@gmail.com>
Mon, 4 Jan 2021 08:43:58 +0000 (09:43 +0100)
docs/configuration.md
docs/tips-and-tricks.md
src/components/Message.vue

index a43d7f1d99f8eff942b0df0d30789c5adf0cd840..93fa8989f6ee7df13be74d670fac973b39b0948e 100644 (file)
@@ -66,6 +66,15 @@ colors:
 # Optional message
 message:
   # url: "https://<my-api-endpoint>" # Can fetch information from an endpoint to override value below.
+  # mapping: # allows to map fields from the remote format to the one expected by Homer
+  #   title: 'id' # use value from field 'id' as title
+  #   content: 'value' # value from field 'value' as content
+  #
+  # Real example using chucknorris.io for showing Chuck Norris facts as messages:
+  # url: https://api.chucknorris.io/jokes/random
+  # mapping:
+  #   title: 'id'
+  #   content: 'value'
   style: "is-warning"
   title: "Optional message!"
   icon: "fa fa-exclamation-triangle"
index 2719fc51786d552a3e368dba4b45b88198e1996b..63eeeaf327b2bbcedfe1b85a7dbd56a1b3a3d226 100644 (file)
@@ -113,6 +113,64 @@ docker create \
 
 
 ## Get the news headlines in Homer
+
+### Mapping Fields
+Most times, the url you're getting headlines from follows a different schema than the one expected by Homer.
+
+For example, if you would like to show jokes from ChuckNorris.io, you'll find that the url https://api.chucknorris.io/jokes/random is giving you info like this:
+
+```json
+{
+  "categories": [],
+  "created_at": "2020-01-05 13:42:22.089095",
+  "icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png",
+  "id": "MR2-BnMBR667xSpQBIleUg",
+  "updated_at": "2020-01-05 13:42:22.089095",
+  "url": "https://api.chucknorris.io/jokes/MR2-BnMBR667xSpQBIleUg",
+  "value": "Chuck Norris can quitely sneak up on himself"
+}
+```
+
+but... you need that info to be transformed to something like this:
+
+```json
+{
+  "title": "MR2-BnMBR667xSpQBIleUg",
+  "content": "Chuck Norris can quitely sneak up on himself"
+}
+```
+
+Now, you can do that using the `mapping` field in your `message` configuration. This example would be something like this:
+
+```yml
+message:
+  url: https://api.chucknorris.io/jokes/random
+    mapping:
+      title: 'id'
+      content: 'value'
+```
+
+As you would see, using the ID as a title doesn't seem nice, that's why when a field is empty it would keep the default values, like this:
+
+```yml
+message:
+  url: https://api.chucknorris.io/jokes/random
+    mapping:
+      content: 'value'
+  title: "Chuck Norris Facts!"
+```
+
+and even an error message in case the `url` didn't respond or threw an error:
+
+```yml
+message:
+  url: https://api.chucknorris.io/jokes/random
+    mapping:
+      content: 'value'
+  title: "Chuck Norris Facts!"
+  content: "Message could not be loaded"
+```
+
 #### `by @JamiePhonic`
 
 Homer allows you to set a "message" that will appear at the top of the page, however, you can also supply a `url:`.
index 5a1e0eaadc2beb72948133eca646d4adf49fe4da..df203ae2e846cabc727d55e5bf63a45cfc46bbcc 100644 (file)
@@ -30,7 +30,8 @@ export default {
     // Look for a new message if an endpoint is provided.
     this.message = Object.assign({}, this.item);
     if (this.item && this.item.url) {
-      const fetchedMessage = await this.getMessage(this.item.url);
+      let fetchedMessage = await this.getMessage(this.item.url);
+      if (this.item.mapping) fetchedMessage = this.mapRemoteMessage(fetchedMessage);
       // keep the original config value if no value is provided by the endpoint
       for (const prop of ["title", "style", "content"]) {
         if (prop in fetchedMessage && fetchedMessage[prop] !== null) {
@@ -49,6 +50,13 @@ export default {
         return response.json();
       });
     },
+
+    mapRemoteMessage: function (message) {
+      let mapped = {};
+      // map property from message into mapped according to mapping config (only if field has a value):
+      for (const prop in this.item.mapping) if (message[this.item.mapping[prop]]) mapped[prop] = message[this.item.mapping[prop]];
+      return mapped;
+    },
   },
 };
 </script>