diff options
author | luixal <luixal@gmail.com> | 2021-01-04 09:43:58 +0100 |
---|---|---|
committer | luixal <luixal@gmail.com> | 2021-01-04 09:43:58 +0100 |
commit | 6d29bc27e78bc549479cbbc203c683137ace9d48 (patch) | |
tree | 29e7de508e38c4f01706e81e8176390e70e3ba0d | |
parent | 3786f80dae2df7780d19ba8ffd9374ef3c2fc30f (diff) | |
download | homer-6d29bc27e78bc549479cbbc203c683137ace9d48.tar.gz homer-6d29bc27e78bc549479cbbc203c683137ace9d48.tar.zst homer-6d29bc27e78bc549479cbbc203c683137ace9d48.zip |
Adds mapping remote field to Homer expected ones when loading message from url
-rw-r--r-- | docs/configuration.md | 9 | ||||
-rw-r--r-- | docs/tips-and-tricks.md | 58 | ||||
-rw-r--r-- | src/components/Message.vue | 10 |
3 files changed, 76 insertions, 1 deletions
diff --git a/docs/configuration.md b/docs/configuration.md index a43d7f1..93fa898 100644 --- a/docs/configuration.md +++ b/docs/configuration.md | |||
@@ -66,6 +66,15 @@ colors: | |||
66 | # Optional message | 66 | # Optional message |
67 | message: | 67 | message: |
68 | # url: "https://<my-api-endpoint>" # Can fetch information from an endpoint to override value below. | 68 | # url: "https://<my-api-endpoint>" # Can fetch information from an endpoint to override value below. |
69 | # mapping: # allows to map fields from the remote format to the one expected by Homer | ||
70 | # title: 'id' # use value from field 'id' as title | ||
71 | # content: 'value' # value from field 'value' as content | ||
72 | # | ||
73 | # Real example using chucknorris.io for showing Chuck Norris facts as messages: | ||
74 | # url: https://api.chucknorris.io/jokes/random | ||
75 | # mapping: | ||
76 | # title: 'id' | ||
77 | # content: 'value' | ||
69 | style: "is-warning" | 78 | style: "is-warning" |
70 | title: "Optional message!" | 79 | title: "Optional message!" |
71 | icon: "fa fa-exclamation-triangle" | 80 | icon: "fa fa-exclamation-triangle" |
diff --git a/docs/tips-and-tricks.md b/docs/tips-and-tricks.md index 2719fc5..63eeeaf 100644 --- a/docs/tips-and-tricks.md +++ b/docs/tips-and-tricks.md | |||
@@ -113,6 +113,64 @@ docker create \ | |||
113 | 113 | ||
114 | 114 | ||
115 | ## Get the news headlines in Homer | 115 | ## Get the news headlines in Homer |
116 | |||
117 | ### Mapping Fields | ||
118 | Most times, the url you're getting headlines from follows a different schema than the one expected by Homer. | ||
119 | |||
120 | 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: | ||
121 | |||
122 | ```json | ||
123 | { | ||
124 | "categories": [], | ||
125 | "created_at": "2020-01-05 13:42:22.089095", | ||
126 | "icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png", | ||
127 | "id": "MR2-BnMBR667xSpQBIleUg", | ||
128 | "updated_at": "2020-01-05 13:42:22.089095", | ||
129 | "url": "https://api.chucknorris.io/jokes/MR2-BnMBR667xSpQBIleUg", | ||
130 | "value": "Chuck Norris can quitely sneak up on himself" | ||
131 | } | ||
132 | ``` | ||
133 | |||
134 | but... you need that info to be transformed to something like this: | ||
135 | |||
136 | ```json | ||
137 | { | ||
138 | "title": "MR2-BnMBR667xSpQBIleUg", | ||
139 | "content": "Chuck Norris can quitely sneak up on himself" | ||
140 | } | ||
141 | ``` | ||
142 | |||
143 | Now, you can do that using the `mapping` field in your `message` configuration. This example would be something like this: | ||
144 | |||
145 | ```yml | ||
146 | message: | ||
147 | url: https://api.chucknorris.io/jokes/random | ||
148 | mapping: | ||
149 | title: 'id' | ||
150 | content: 'value' | ||
151 | ``` | ||
152 | |||
153 | 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: | ||
154 | |||
155 | ```yml | ||
156 | message: | ||
157 | url: https://api.chucknorris.io/jokes/random | ||
158 | mapping: | ||
159 | content: 'value' | ||
160 | title: "Chuck Norris Facts!" | ||
161 | ``` | ||
162 | |||
163 | and even an error message in case the `url` didn't respond or threw an error: | ||
164 | |||
165 | ```yml | ||
166 | message: | ||
167 | url: https://api.chucknorris.io/jokes/random | ||
168 | mapping: | ||
169 | content: 'value' | ||
170 | title: "Chuck Norris Facts!" | ||
171 | content: "Message could not be loaded" | ||
172 | ``` | ||
173 | |||
116 | #### `by @JamiePhonic` | 174 | #### `by @JamiePhonic` |
117 | 175 | ||
118 | Homer allows you to set a "message" that will appear at the top of the page, however, you can also supply a `url:`. | 176 | Homer allows you to set a "message" that will appear at the top of the page, however, you can also supply a `url:`. |
diff --git a/src/components/Message.vue b/src/components/Message.vue index 5a1e0ea..df203ae 100644 --- a/src/components/Message.vue +++ b/src/components/Message.vue | |||
@@ -30,7 +30,8 @@ export default { | |||
30 | // Look for a new message if an endpoint is provided. | 30 | // Look for a new message if an endpoint is provided. |
31 | this.message = Object.assign({}, this.item); | 31 | this.message = Object.assign({}, this.item); |
32 | if (this.item && this.item.url) { | 32 | if (this.item && this.item.url) { |
33 | const fetchedMessage = await this.getMessage(this.item.url); | 33 | let fetchedMessage = await this.getMessage(this.item.url); |
34 | if (this.item.mapping) fetchedMessage = this.mapRemoteMessage(fetchedMessage); | ||
34 | // keep the original config value if no value is provided by the endpoint | 35 | // keep the original config value if no value is provided by the endpoint |
35 | for (const prop of ["title", "style", "content"]) { | 36 | for (const prop of ["title", "style", "content"]) { |
36 | if (prop in fetchedMessage && fetchedMessage[prop] !== null) { | 37 | if (prop in fetchedMessage && fetchedMessage[prop] !== null) { |
@@ -49,6 +50,13 @@ export default { | |||
49 | return response.json(); | 50 | return response.json(); |
50 | }); | 51 | }); |
51 | }, | 52 | }, |
53 | |||
54 | mapRemoteMessage: function (message) { | ||
55 | let mapped = {}; | ||
56 | // map property from message into mapped according to mapping config (only if field has a value): | ||
57 | for (const prop in this.item.mapping) if (message[this.item.mapping[prop]]) mapped[prop] = message[this.item.mapping[prop]]; | ||
58 | return mapped; | ||
59 | }, | ||
52 | }, | 60 | }, |
53 | }; | 61 | }; |
54 | </script> | 62 | </script> |