main
vue 136 lines 3.69 KB
Raw
1 <template>
2 <div class="flex min-h-120 flex-col gap-4 overflow-hidden">
3 <div class="flex flex-col gap-4">
4 <n-form-item label="Name" required>
5 <n-input v-model:value="form.name" placeholder="e.g. Wazuh Alerts" clearable />
6 </n-form-item>
7
8 <n-form-item label="Index Pattern" required>
9 <n-input
10 v-model:value="form.index_pattern"
11 :placeholder="`e.g. wazuh-${props.customerCode}_*`"
12 clearable
13 />
14 </n-form-item>
15
16 <n-form-item label="Event Type" required>
17 <n-select v-model:value="form.event_type" :options="eventTypeOptions" placeholder="Select type" />
18 </n-form-item>
19
20 <n-form-item label="Time Field">
21 <n-input v-model:value="form.time_field" placeholder="e.g. timestamp" clearable />
22 </n-form-item>
23
24 <n-form-item label="Enabled">
25 <n-switch v-model:value="form.enabled" />
26 </n-form-item>
27 </div>
28
29 <div class="flex justify-between gap-4">
30 <n-button @click="close()">Close</n-button>
31 <n-button type="primary" :disabled="!isValid" :loading @click="submit()">
32 {{ isEditing ? "Update" : "Create" }}
33 </n-button>
34 </div>
35 </div>
36 </template>
37
38 <script setup lang="ts">
39 import type { EventSource } from "@/types/eventSources.d"
40 import { NButton, NFormItem, NInput, NSelect, NSwitch, useMessage } from "naive-ui"
41 import { computed, reactive, ref } from "vue"
42 import Api from "@/api"
43
44 const props = defineProps<{
45 customerCode: string
46 editingSource?: EventSource | null
47 }>()
48
49 const emit = defineEmits<{
50 (e: "close"): void
51 (e: "submitted"): void
52 }>()
53
54 const message = useMessage()
55 const loading = ref(false)
56
57 const isEditing = computed(() => !!props.editingSource)
58
59 const eventTypeOptions = [
60 { label: "EDR", value: "EDR" },
61 { label: "EPP", value: "EPP" },
62 { label: "Cloud Integration", value: "Cloud Integration" },
63 { label: "Network Security", value: "Network Security" }
64 ]
65
66 const form = reactive({
67 name: props.editingSource?.name || "",
68 index_pattern: props.editingSource?.index_pattern || "",
69 event_type: props.editingSource?.event_type || (null as string | null),
70 time_field: props.editingSource?.time_field || "timestamp",
71 enabled: props.editingSource?.enabled ?? true
72 })
73
74 const isValid = computed(() => {
75 return !!form.name && !!form.index_pattern && !!form.event_type
76 })
77
78 function submit() {
79 if (!isValid.value) return
80
81 loading.value = true
82
83 if (isEditing.value && props.editingSource) {
84 Api.siem
85 .updateEventSource(props.editingSource.id, {
86 name: form.name,
87 index_pattern: form.index_pattern,
88 event_type: form.event_type || "",
89 time_field: form.time_field,
90 enabled: form.enabled
91 })
92 .then(res => {
93 if (res.data.success) {
94 emit("submitted")
95 message.success(res.data?.message || "Event source updated successfully.")
96 } else {
97 message.warning(res.data?.message || "An error occurred. Please try again later.")
98 }
99 })
100 .catch(err => {
101 message.error(err.response?.data?.message || "An error occurred. Please try again later.")
102 })
103 .finally(() => {
104 loading.value = false
105 })
106 } else {
107 Api.siem
108 .createEventSource({
109 customer_code: props.customerCode,
110 name: form.name,
111 index_pattern: form.index_pattern,
112 event_type: form.event_type || "",
113 time_field: form.time_field,
114 enabled: form.enabled
115 })
116 .then(res => {
117 if (res.data.success) {
118 emit("submitted")
119 message.success(res.data?.message || "Event source created successfully.")
120 } else {
121 message.warning(res.data?.message || "An error occurred. Please try again later.")
122 }
123 })
124 .catch(err => {
125 message.error(err.response?.data?.message || "An error occurred. Please try again later.")
126 })
127 .finally(() => {
128 loading.value = false
129 })
130 }
131 }
132
133 function close() {
134 emit("close")
135 }
136 </script>