From dc8c9ad376085ec50d292190958efb615404a44c Mon Sep 17 00:00:00 2001
From: Nils Brinckmann <nils.brinckmann@gfz-potsdam.de>
Date: Thu, 11 Mar 2021 08:43:17 +0100
Subject: [PATCH] Fixed customfields api

---
 pages/devices/_deviceId/customfields.vue      |  4 +-
 .../_deviceId/customfields/_customfieldId.vue |  2 +
 .../customfields/_customfieldId/edit.vue      |  4 +-
 .../jsonapi/CustomTextFieldSerializer.ts      | 12 +++++-
 services/Api.ts                               | 10 ++---
 ...{CustomFieldsApi.ts => CustomfieldsApi.ts} | 42 +++++++------------
 6 files changed, 36 insertions(+), 38 deletions(-)
 rename services/sms/{CustomFieldsApi.ts => CustomfieldsApi.ts} (78%)

diff --git a/pages/devices/_deviceId/customfields.vue b/pages/devices/_deviceId/customfields.vue
index cdd803465..fab2e3e08 100644
--- a/pages/devices/_deviceId/customfields.vue
+++ b/pages/devices/_deviceId/customfields.vue
@@ -90,7 +90,7 @@ export default class DeviceCustomFieldsPage extends Vue {
   addField (): void {
     const field = new CustomTextField()
     this.isSaving = true
-    this.$api.customFields.add(this.deviceId, field).then(() => {
+    this.$api.customfields.add(this.deviceId, field).then(() => {
       this.isSaving = false
       this.$router.push('/devices/' + this.deviceId + '/customfields')
     }).catch(() => {
@@ -103,7 +103,7 @@ export default class DeviceCustomFieldsPage extends Vue {
     if (!field.id) {
       return
     }
-    this.$api.customFields.deleteById(field.id).then(() => {
+    this.$api.customfields.deleteById(field.id).then(() => {
       const index: number = this.customFields.findIndex((f: CustomTextField) => f.id === field.id)
       if (index > -1) {
         this.customFields.splice(index, 1)
diff --git a/pages/devices/_deviceId/customfields/_customfieldId.vue b/pages/devices/_deviceId/customfields/_customfieldId.vue
index 1aed90a81..1ccd4a248 100644
--- a/pages/devices/_deviceId/customfields/_customfieldId.vue
+++ b/pages/devices/_deviceId/customfields/_customfieldId.vue
@@ -17,6 +17,8 @@ import { Component, Vue, Prop } from 'nuxt-property-decorator'
 import CustomFieldCard from '@/components/CustomFieldCard.vue'
 import ProgressIndicator from '@/components/ProgressIndicator.vue'
 
+import { CustomTextField } from '@/models/CustomTextField'
+
 @Component({
   components: {
     CustomFieldCard,
diff --git a/pages/devices/_deviceId/customfields/_customfieldId/edit.vue b/pages/devices/_deviceId/customfields/_customfieldId/edit.vue
index 9c517ce99..221cd2e54 100644
--- a/pages/devices/_deviceId/customfields/_customfieldId/edit.vue
+++ b/pages/devices/_deviceId/customfields/_customfieldId/edit.vue
@@ -73,11 +73,11 @@ export default class DeviceCustomFieldsShowPage extends Vue {
 
   save (): void {
     this.isSaving = true
-    this.$api.customFields.save(this.deviceId, this.valueCopy).then(() => {
+    this.$api.customfields.update(this.deviceId, this.valueCopy).then(() => {
       this.isSaving = false
       this.$emit('input', this.valueCopy)
       this.$router.push('/devices/' + this.deviceId + '/customfields')
-    }).catch((e) => {
+    }).catch((_e: Error) => {
       this.isSaving = false
       this.$store.commit('snackbar/setError', 'Failed to save custom field')
     })
diff --git a/serializers/jsonapi/CustomTextFieldSerializer.ts b/serializers/jsonapi/CustomTextFieldSerializer.ts
index 8cc0c0cd8..93db4e32b 100644
--- a/serializers/jsonapi/CustomTextFieldSerializer.ts
+++ b/serializers/jsonapi/CustomTextFieldSerializer.ts
@@ -31,7 +31,7 @@
  */
 import { ICustomTextField, CustomTextField } from '@/models/CustomTextField'
 import {
-  IJsonApiDataWithOptionalIdWithoutRelationships,
+  IJsonApiDataWithOptionalId,
   IJsonApiNestedElement,
   IJsonApiObject,
   IJsonApiObjectList,
@@ -100,12 +100,20 @@ export class CustomTextFieldSerializer {
     }
   }
 
-  convertModelToJsonApiData (customField: ICustomTextField): IJsonApiDataWithOptionalIdWithoutRelationships {
+  convertModelToJsonApiData (customField: ICustomTextField, deviceId: string): IJsonApiDataWithOptionalId {
     const data: any = {
       type: 'customfield',
       attributes: {
         key: customField.key,
         value: customField.value
+      },
+      relationships: {
+        device: {
+          data: {
+            type: 'device',
+            id: deviceId
+          }
+        }
       }
     }
     if (customField.id) {
diff --git a/services/Api.ts b/services/Api.ts
index 161d5016b..cea629b70 100644
--- a/services/Api.ts
+++ b/services/Api.ts
@@ -36,7 +36,7 @@ import { DeviceApi } from '@/services/sms/DeviceApi'
 import { PlatformApi } from '@/services/sms/PlatformApi'
 import { ConfigurationApi } from '@/services/sms/ConfigurationApi'
 import { ConfigurationStatusApi } from '@/services/sms/ConfigurationStatusApi'
-import { CustomFieldsApi } from '@/services/sms/CustomFieldsApi'
+import { CustomfieldsApi } from '@/services/sms/CustomfieldsApi'
 
 import { CompartmentApi } from '@/services/cv/CompartmentApi'
 import { DeviceTypeApi } from '@/services/cv/DeviceTypeApi'
@@ -59,7 +59,7 @@ export class Api {
   private readonly _platformApi: PlatformApi
   private readonly _configurationApi: ConfigurationApi
   private readonly _configurationStatesApi: ConfigurationStatusApi
-  private readonly _customFieldsApi: CustomFieldsApi
+  private readonly _customfieldsApi: CustomfieldsApi
 
   private readonly _manufacturerApi: ManufacturerApi
   private readonly _platformTypeApi: PlatformTypeApi
@@ -101,7 +101,7 @@ export class Api {
     )
     this._configurationStatesApi = new ConfigurationStatusApi()
 
-    this._customFieldsApi = new CustomFieldsApi(
+    this._customfieldsApi = new CustomfieldsApi(
       this.createAxios(smsBaseUrl, '/customfields', smsConfig, getIdToken)
     )
 
@@ -185,8 +185,8 @@ export class Api {
     return this._configurationStatesApi
   }
 
-  get customFields (): CustomFieldsApi {
-    return this._customFieldsApi
+  get customfields (): CustomfieldsApi {
+    return this._customfieldsApi
   }
 
   get contacts (): ContactApi {
diff --git a/services/sms/CustomFieldsApi.ts b/services/sms/CustomfieldsApi.ts
similarity index 78%
rename from services/sms/CustomFieldsApi.ts
rename to services/sms/CustomfieldsApi.ts
index a26bffb37..8bf2807bb 100644
--- a/services/sms/CustomFieldsApi.ts
+++ b/services/sms/CustomfieldsApi.ts
@@ -29,12 +29,12 @@
  * implied. See the Licence for the specific language governing
  * permissions and limitations under the Licence.
  */
-import { AxiosInstance, Method } from 'axios'
+import { AxiosInstance } from 'axios'
 
 import { CustomTextField } from '@/models/CustomTextField'
 import { CustomTextFieldSerializer } from '@/serializers/jsonapi/CustomTextFieldSerializer'
 
-export class CustomFieldsApi {
+export class CustomfieldsApi {
   private axiosApi: AxiosInstance
   private serializer: CustomTextFieldSerializer
 
@@ -45,9 +45,7 @@ export class CustomFieldsApi {
 
   findById (id: string): Promise<CustomTextField> {
     return this.axiosApi.get(id, {
-      params: {
-        include: 'contacts'
-      }
+      // params: {}
     }).then((rawResponse) => {
       const rawData = rawResponse.data
       return this.serializer.convertJsonApiObjectToModel(rawData)
@@ -59,31 +57,21 @@ export class CustomFieldsApi {
   }
 
   add (deviceId: string, field: CustomTextField) {
+    const url = ''
+    const data: any = this.serializer.convertModelToJsonApiData(field, deviceId)
+    return this.axiosApi.post(url, { data })
   }
 
-  save (deviceId: string, field: CustomTextField) {
-    const data: any = this.serializer.convertModelToJsonApiData(field)
-    let method: Method = 'patch'
-    let url = deviceId + '/customfields'
-
-    if (field.id === null) {
-      // new -> post
-      method = 'post'
-    } else {
-      // old -> patch
-      url += '/' + String(field.id)
-    }
-
-    console.log(data)
-
-    return this.axiosApi.request({
-      url,
-      method,
-      data: {
-        data
+  update (deviceId: string, field: CustomTextField) {
+    return new Promise<string>((resolve, reject) => {
+      if (field.id) {
+        resolve(field.id)
+      } else {
+        reject(new Error('no id for the CustomTextField'))
       }
-    }).then((rawServerResponse) => {
-      console.log(rawServerResponse)
+    }).then((fieldId) => {
+      const data: any = this.serializer.convertModelToJsonApiData(field, deviceId)
+      return this.axiosApi.patch(fieldId, { data })
     })
   }
 }
-- 
GitLab