diff --git a/packages/api/src/controllers/sensorController.js b/packages/api/src/controllers/sensorController.js index 170cb822a5..7a68db3df6 100644 --- a/packages/api/src/controllers/sensorController.js +++ b/packages/api/src/controllers/sensorController.js @@ -17,9 +17,9 @@ import baseController from '../controllers/baseController.js'; import SensorModel from '../models/sensorModel.js'; import SensorReadingModel from '../models/sensorReadingModel.js'; -import IntegratingPartnersModel from '../models/integratingPartnersModel.js'; +import AddonPartnerModel from '../models/addonPartnerModel.js'; import NotificationUser from '../models/notificationUserModel.js'; -import FarmExternalIntegrationsModel from '../models/farmExternalIntegrationsModel.js'; +import FarmAddonModel from '../models/farmAddonModel.js'; import LocationModel from '../models/locationModel.js'; import PointModel from '../models/pointModel.js'; import FigureModel from '../models/figureModel.js'; @@ -100,8 +100,8 @@ const sensorController = { async getBrandName(req, res) { try { const { partner_id } = req.params; - const brand_name_response = await IntegratingPartnersModel.getBrandName(partner_id); - res.status(200).send(brand_name_response.partner_name); + const brand_name_response = await AddonPartnerModel.getBrandName(partner_id); + res.status(200).send(brand_name_response.name); } catch (error) { res.status(404).send('Partner not found'); } @@ -118,9 +118,7 @@ const sensorController = { const { farm_id } = req.headers; const { user_id } = req.auth; try { - const { access_token } = await IntegratingPartnersModel.getAccessAndRefreshTokens( - ENSEMBLE_BRAND, - ); + const { access_token } = await AddonPartnerModel.getAccessAndRefreshTokens(ENSEMBLE_BRAND); //TODO: LF-4443 - Sensor should not use User language (unrestricted string), accept as body param or farm level detail const [{ language_preference }] = await baseController.getIndividual(UserModel, user_id); @@ -615,24 +613,18 @@ const sensorController = { const sensor = await baseController.getByFieldId(SensorModel, 'location_id', location_id); const { external_id, partner_id } = sensor[0]; - const brand = await baseController.getByFieldId( - IntegratingPartnersModel, - 'partner_id', - partner_id, - ); - const { partner_name } = brand[0]; + const brand = await baseController.getByFieldId(AddonPartnerModel, 'id', partner_id); + const { name } = brand[0]; const user_id = req.auth.user_id; - const { access_token } = await IntegratingPartnersModel.getAccessAndRefreshTokens( - ENSEMBLE_BRAND, - ); + const { access_token } = await AddonPartnerModel.getAccessAndRefreshTokens(ENSEMBLE_BRAND); let unclaimResponse; - if (partner_name != 'No Integrating Partner' && external_id != '') { - const external_integrations_response = await FarmExternalIntegrationsModel.getOrganizationId( + if (name != 'No Integrating Partner' && external_id != '') { + const external_integrations_response = await FarmAddonModel.getOrganizationId( farm_id, partner_id, ); - const org_id = external_integrations_response.organization_uuid; + const org_id = external_integrations_response.org_uuid; unclaimResponse = await unclaimSensor(org_id, external_id, access_token); if (unclaimResponse?.status != 200) { diff --git a/packages/api/src/models/PartnerReadingTypeModel.js b/packages/api/src/models/PartnerReadingTypeModel.js index 1e6af8a305..d0975d60b7 100644 --- a/packages/api/src/models/PartnerReadingTypeModel.js +++ b/packages/api/src/models/PartnerReadingTypeModel.js @@ -16,7 +16,7 @@ import BaseModel from './baseModel.js'; import Model from './baseFormatModel.js'; -import IntegratingPartners from './integratingPartnersModel.js'; +import AddonPartner from './addonPartnerModel.js'; class PartnerReadingTypeModel extends BaseModel { /** @@ -62,11 +62,11 @@ class PartnerReadingTypeModel extends BaseModel { static get relationMappings() { return { partner: { - modelClass: IntegratingPartners, + modelClass: AddonPartner, relation: Model.HasOneRelation, join: { from: 'partner_reading_type.partner_id', - to: 'integrating_partner.partner_id', + to: 'addon_partner.id', }, }, }; diff --git a/packages/api/src/models/integratingPartnersModel.js b/packages/api/src/models/addonPartnerModel.js similarity index 68% rename from packages/api/src/models/integratingPartnersModel.js rename to packages/api/src/models/addonPartnerModel.js index 3e31e1ed18..de5f1ee838 100644 --- a/packages/api/src/models/integratingPartnersModel.js +++ b/packages/api/src/models/addonPartnerModel.js @@ -15,14 +15,14 @@ import Model from './baseFormatModel.js'; -class IntegratingPartners extends Model { +class AddonPartner extends Model { /** * Identifies the database table for this Model. * @static * @returns {string} Names of the database table. */ static get tableName() { - return 'integrating_partner'; + return 'addon_partner'; } /** @@ -31,7 +31,7 @@ class IntegratingPartners extends Model { * @returns {string} Names of the primary key fields. */ static get idColumn() { - return 'partner_id'; + return 'id'; } /** @@ -43,8 +43,8 @@ class IntegratingPartners extends Model { return { type: 'object', properties: { - partner_id: { type: 'integer' }, - partner_name: { type: 'string' }, + id: { type: 'integer' }, + name: { type: 'string' }, access_token: { type: 'string' }, refresh_token: { type: 'string' }, root_url: { type: 'string' }, @@ -54,24 +54,21 @@ class IntegratingPartners extends Model { }; } - static async getAccessAndRefreshTokens(partner_name) { - return await IntegratingPartners.query() + static async getAccessAndRefreshTokens(name) { + return await AddonPartner.query() .select('access_token', 'refresh_token') - .where({ partner_name, deactivated: false }) + .where({ name, deactivated: false }) .first(); } - static async patchAccessAndRefreshTokens(partner_name, access_token, refresh_token) { - return await IntegratingPartners.query() + static async patchAccessAndRefreshTokens(name, access_token, refresh_token) { + return await AddonPartner.query() .patch({ access_token, refresh_token }) - .where({ partner_name, deactivated: false }); + .where({ name, deactivated: false }); } - static async getBrandName(partner_id) { - return await IntegratingPartners.query() - .select('partner_name') - .where('partner_id', partner_id) - .first(); + static async getBrandName(id) { + return await AddonPartner.query().select('name').where('id', id).first(); } } -export default IntegratingPartners; +export default AddonPartner; diff --git a/packages/api/src/models/farmExternalIntegrationsModel.js b/packages/api/src/models/farmAddonModel.js similarity index 71% rename from packages/api/src/models/farmExternalIntegrationsModel.js rename to packages/api/src/models/farmAddonModel.js index c88814f1e5..40d72a5191 100644 --- a/packages/api/src/models/farmExternalIntegrationsModel.js +++ b/packages/api/src/models/farmAddonModel.js @@ -15,17 +15,17 @@ import Model from './baseFormatModel.js'; -import IntegratingPartners from './integratingPartnersModel.js'; +import AddonPartner from './addonPartnerModel.js'; import Farm from './farmModel.js'; -class FarmExternalIntegrations extends Model { +class FarmAddon extends Model { /** * Identifies the database table for this Model. * @static * @returns {string} Names of the database table. */ static get tableName() { - return 'farm_external_integration'; + return 'farm_addon'; } /** @@ -34,7 +34,7 @@ class FarmExternalIntegrations extends Model { * @returns {string[]} Names of the primary key fields. */ static get idColumn() { - return ['farm_id', 'partner_id']; + return ['farm_id', 'addon_partner_id']; } /** @@ -47,9 +47,9 @@ class FarmExternalIntegrations extends Model { type: 'object', properties: { farm_id: { type: 'string' }, - partner_id: { type: 'integer' }, - organization_uuid: { type: 'string' }, - webhook_id: { type: 'integer' }, + addon_partner_id: { type: 'integer' }, + org_uuid: { type: 'string' }, + org_pk: { type: 'integer' }, }, additionalProperties: false, }; @@ -70,12 +70,12 @@ class FarmExternalIntegrations extends Model { to: 'farm.farm_id', }, }, - partner: { - modelClass: IntegratingPartners, + addon: { + modelClass: AddonPartner, relation: Model.HasOneRelation, join: { - from: 'farm_external_integration.partner_id', - to: 'integrating_partner.partner_id', + from: 'farm_addon.addon_partner_id', + to: 'addon_partner.id', }, }, }; @@ -88,18 +88,16 @@ class FarmExternalIntegrations extends Model { * @return {Promise<*>} */ static async updateWebhookId(farmId, webhookId) { - return FarmExternalIntegrations.query() - .patch({ webhook_id: webhookId }) - .where('farm_id', farmId); + return FarmAddon.query().patch({ webhook_id: webhookId }).where('farm_id', farmId); } - static async getOrganizationId(farmId, partnerId) { - return FarmExternalIntegrations.query() - .select('organization_uuid') + static async getOrganizationId(farmId, addonPartnerId) { + return FarmAddon.query() + .select('org_uuid') .where('farm_id', farmId) - .where('partner_id', partnerId) + .where('addon_partner_id', addonPartnerId) .first(); } } -export default FarmExternalIntegrations; +export default FarmAddon; diff --git a/packages/api/src/util/ensemble.js b/packages/api/src/util/ensemble.js index 95a28c8720..85e467b2e6 100644 --- a/packages/api/src/util/ensemble.js +++ b/packages/api/src/util/ensemble.js @@ -23,8 +23,8 @@ const dir = path.dirname(fileURLToPath(import.meta.url)); dotenv.config({ path: path.resolve(dir, '..', '..', '.env') }); import FarmModel from '../models/farmModel.js'; -import FarmExternalIntegrationsModel from '../models/farmExternalIntegrationsModel.js'; -import IntegratingPartners from '../models/integratingPartnersModel.js'; +import FarmAddonModel from '../models/farmAddonModel.js'; +import AddonPartner from '../models/addonPartnerModel.js'; import endPoints from '../endPoints.js'; import { fileURLToPath } from 'url'; const { ensembleAPI } = endPoints; @@ -75,10 +75,10 @@ async function registerFarmAndClaimSensors(farm_id, access_token, esids) { const organization = await createOrganization(farm_id, access_token); // Create a webhook for the organization - await registerOrganizationWebhook(farm_id, organization.organization_uuid, access_token); + await registerOrganizationWebhook(farm_id, organization.org_uuid, access_token); // Register sensors with Ensemble and return Ensemble API results - return await bulkSensorClaim(access_token, organization.organization_uuid, esids); + return await bulkSensorClaim(access_token, organization.org_uuid, esids); } /** @@ -129,8 +129,8 @@ async function bulkSensorClaim(accessToken, organizationId, esids) { async function registerOrganizationWebhook(farmId, organizationId, accessToken) { const authHeader = `${farmId}${process.env.SENSOR_SECRET}`; - const existingIntegration = await FarmExternalIntegrationsModel.query() - .where({ farm_id: farmId, partner_id: 1 }) + const existingIntegration = await FarmAddonModel.query() + .where({ farm_id: farmId, addon_partner_id: 1 }) .first(); if (existingIntegration?.webhook_id) { return; @@ -150,7 +150,7 @@ async function registerOrganizationWebhook(farmId, organizationId, accessToken) throw new Error('Failed to register webhook with ESCI'); }; const onResponse = async (response) => { - await FarmExternalIntegrationsModel.updateWebhookId(farmId, response.data.id); + await FarmAddonModel.updateWebhookId(farmId, response.data.id); return { ...response.data, status: response.status }; }; await ensembleAPICall(accessToken, axiosObject, onError, onResponse); @@ -161,13 +161,13 @@ async function registerOrganizationWebhook(farmId, organizationId, accessToken) * @param farmId * @param accessToken * @async - * @return {Promise<{details: string, status: number}|FarmExternalIntegrations>} + * @return {Promise<{details: string, status: number}|FarmAddon>} */ async function createOrganization(farmId, accessToken) { try { const data = await FarmModel.getFarmById(farmId); - const existingIntegration = await FarmExternalIntegrationsModel.query() - .where({ farm_id: farmId, partner_id: 1 }) + const existingIntegration = await FarmAddonModel.query() + .where({ farm_id: farmId, addon_partner_id: 1 }) .first(); if (!existingIntegration) { const axiosObject = { @@ -184,10 +184,10 @@ async function createOrganization(farmId, accessToken) { const response = await ensembleAPICall(accessToken, axiosObject, onError); - return await FarmExternalIntegrationsModel.query().insert({ + return await FarmAddonModel.query().insert({ farm_id: farmId, - partner_id: 1, - organization_uuid: response.data.uuid, + addon_partner_id: 1, + org_uuid: response.data.uuid, }); } else { return existingIntegration; @@ -272,9 +272,9 @@ function isAuthError(error) { */ async function refreshTokens() { try { - const { refresh_token } = await IntegratingPartners.getAccessAndRefreshTokens(ENSEMBLE_BRAND); + const { refresh_token } = await AddonPartner.getAccessAndRefreshTokens(ENSEMBLE_BRAND); const response = await axios.post(ensembleAPI + '/token/refresh/', { refresh: refresh_token }); - await IntegratingPartners.patchAccessAndRefreshTokens( + await AddonPartner.patchAccessAndRefreshTokens( ENSEMBLE_BRAND, response.data?.access, response.data?.access, @@ -300,7 +300,7 @@ async function authenticateToGetTokens() { const username = process.env.ENSEMBLE_USERNAME; const password = process.env.ENSEMBLE_PASSWORD; const response = await axios.post(ensembleAPI + '/token/', { username, password }); - await IntegratingPartners.patchAccessAndRefreshTokens( + await AddonPartner.patchAccessAndRefreshTokens( ENSEMBLE_BRAND, response.data?.access, response.data?.access,