make it possible to change notification data field key name
This commit is contained in:
parent
817e7d2e37
commit
88163cad42
3 changed files with 44 additions and 7 deletions
|
|
@ -46,12 +46,14 @@ class TargetRequest:
|
||||||
method: str
|
method: str
|
||||||
url: str
|
url: str
|
||||||
headers: list[TargetRequestHeader] = field(default_factory=list)
|
headers: list[TargetRequestHeader] = field(default_factory=list)
|
||||||
|
data_key: str = "data"
|
||||||
|
|
||||||
def serialize(self) -> dict:
|
def serialize(self) -> dict:
|
||||||
return {
|
return {
|
||||||
"type": self.type,
|
"type": self.type,
|
||||||
"method": self.method,
|
"method": self.method,
|
||||||
"url": self.url,
|
"url": self.url,
|
||||||
|
"data_key": self.data_key,
|
||||||
"headers": [h.serialize() for h in self.headers],
|
"headers": [h.serialize() for h in self.headers],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -247,6 +249,7 @@ class Notification(metaclass=Singleton):
|
||||||
type=target.get("request", {}).get("type", "json"),
|
type=target.get("request", {}).get("type", "json"),
|
||||||
method=target.get("request", {}).get("method", "POST"),
|
method=target.get("request", {}).get("method", "POST"),
|
||||||
url=target.get("request", {}).get("url"),
|
url=target.get("request", {}).get("url"),
|
||||||
|
data_key=target.get("request", {}).get("data_key", "data"),
|
||||||
headers=[
|
headers=[
|
||||||
TargetRequestHeader(
|
TargetRequestHeader(
|
||||||
key=str(h.get("key", "")).strip(),
|
key=str(h.get("key", "")).strip(),
|
||||||
|
|
@ -288,6 +291,10 @@ class Notification(metaclass=Singleton):
|
||||||
msg = "Invalid notification target. No URL found."
|
msg = "Invalid notification target. No URL found."
|
||||||
raise ValueError(msg)
|
raise ValueError(msg)
|
||||||
|
|
||||||
|
if "data_key" not in target["request"]:
|
||||||
|
msg = "Invalid notification target. No data_key found."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
if "method" in target["request"] and target["request"]["method"].upper() not in ["POST", "PUT"]:
|
if "method" in target["request"] and target["request"]["method"].upper() not in ["POST", "PUT"]:
|
||||||
msg = "Invalid notification target. Invalid method found."
|
msg = "Invalid notification target. Invalid method found."
|
||||||
raise ValueError(msg)
|
raise ValueError(msg)
|
||||||
|
|
@ -363,10 +370,17 @@ class Notification(metaclass=Singleton):
|
||||||
for h in target.request.headers:
|
for h in target.request.headers:
|
||||||
reqBody["headers"][h.key] = h.value
|
reqBody["headers"][h.key] = h.value
|
||||||
|
|
||||||
reqBody["json" if "json" == target.request.type.lower() else "data"] = self._deep_unpack(ev.serialize())
|
body_key = "json" if "json" == target.request.type.lower() else "data"
|
||||||
|
reqBody[body_key] = self._deep_unpack(ev.serialize())
|
||||||
|
|
||||||
|
if "data" != target.request.data_key:
|
||||||
|
reqBody[body_key][target.request.data_key] = reqBody[body_key]["data"]
|
||||||
|
reqBody[body_key].pop("data", None)
|
||||||
|
|
||||||
if "form" == target.request.type.lower():
|
if "form" == target.request.type.lower():
|
||||||
reqBody["data"]["data"] = self._encoder.encode(reqBody["data"]["data"])
|
reqBody[body_key][target.request.data_key] = self._encoder.encode(
|
||||||
|
reqBody[body_key][target.request.data_key]
|
||||||
|
)
|
||||||
|
|
||||||
response = await self._client.request(**reqBody)
|
response = await self._client.request(**reqBody)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -138,7 +138,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="column is-12 is-clearfix">
|
<div class="column is-6-tablet is-12-mobile">
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label class="label is-inline" for="on">
|
<label class="label is-inline" for="on">
|
||||||
Select Events
|
Select Events
|
||||||
|
|
@ -167,6 +167,26 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="column is-6-tablet is-12-mobile">
|
||||||
|
<div class="field">
|
||||||
|
<label class="label is-inline" for="data_key">
|
||||||
|
Data field
|
||||||
|
</label>
|
||||||
|
<div class="control has-icons-left">
|
||||||
|
<input type="text" class="input" id="data_key" v-model="form.request.data_key"
|
||||||
|
:disabled="addInProgress" required>
|
||||||
|
<span class="icon is-small is-left"><i class="fa-solid fa-key" /></span>
|
||||||
|
</div>
|
||||||
|
<span class="help">
|
||||||
|
<span class="icon"><i class="fa-solid fa-info" /></span>
|
||||||
|
<span>
|
||||||
|
The field name to use when sending the notification. This is used to identify the data in the
|
||||||
|
request. The default is <code>data</code>.
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="column is-12">
|
<div class="column is-12">
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label class="label is-inline is-unselectable">
|
<label class="label is-inline is-unselectable">
|
||||||
|
|
@ -277,7 +297,7 @@ const showImport = useStorage('showImport', false);
|
||||||
const import_string = ref('');
|
const import_string = ref('');
|
||||||
|
|
||||||
const checkInfo = async () => {
|
const checkInfo = async () => {
|
||||||
const required = ['name', 'request.url', 'request.method', 'request.type'];
|
const required = ['name', 'request.url', 'request.method', 'request.type', 'request.data_key'];
|
||||||
for (const key of required) {
|
for (const key of required) {
|
||||||
if (key.includes('.')) {
|
if (key.includes('.')) {
|
||||||
const [parent, child] = key.split('.');
|
const [parent, child] = key.split('.');
|
||||||
|
|
@ -356,6 +376,10 @@ const importItem = async () => {
|
||||||
form.request = item.request
|
form.request = item.request
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (item.data_key) {
|
||||||
|
form.data_key = item.data_key
|
||||||
|
}
|
||||||
|
|
||||||
if (item.on) {
|
if (item.on) {
|
||||||
form.on = item.on
|
form.on = item.on
|
||||||
}
|
}
|
||||||
|
|
@ -366,5 +390,4 @@ const importItem = async () => {
|
||||||
toast.error(`Failed to import task. ${e.message}`)
|
toast.error(`Failed to import task. ${e.message}`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -126,8 +126,8 @@ div.is-centered {
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
When you set the request type as <code>Form</code>, the event data will be JSON encoded and sent as the
|
When you set the request type as <code>Form</code>, the event data will be JSON encoded and sent as the
|
||||||
and sent as <code>...&data=json_string</code>, only the <code>data</code> field will be JSON encoded. The
|
and sent as <code>...&data_key=json_string</code>, only the <code>data</code> field will be JSON encoded.
|
||||||
other keys <code>id</code>, <code>event</code> and <code>created_at</code> will be sent as they are.
|
The other keys <code>id</code>, <code>event</code> and <code>created_at</code> will be sent as they are.
|
||||||
</li>
|
</li>
|
||||||
<li>We also send two special headers <code>X-Event-ID</code> and <code>X-Event</code> with the request.</li>
|
<li>We also send two special headers <code>X-Event-ID</code> and <code>X-Event</code> with the request.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue