Skip to content

Commit

Permalink
Merge pull request #3664 from LiteFarmOrg/LF-4692-update-farm-addon-m…
Browse files Browse the repository at this point in the history
…odel

Lf 4692 update farm addon model
  • Loading branch information
kathyavini authored Jan 29, 2025
2 parents d766ee6 + 411d437 commit 7dec502
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 74 deletions.
30 changes: 11 additions & 19 deletions packages/api/src/controllers/sensorController.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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');
}
Expand All @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down
6 changes: 3 additions & 3 deletions packages/api/src/models/PartnerReadingTypeModel.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
/**
Expand Down Expand Up @@ -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',
},
},
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
}

/**
Expand All @@ -31,7 +31,7 @@ class IntegratingPartners extends Model {
* @returns {string} Names of the primary key fields.
*/
static get idColumn() {
return 'partner_id';
return 'id';
}

/**
Expand All @@ -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' },
Expand All @@ -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;
Original file line number Diff line number Diff line change
Expand Up @@ -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';
}

/**
Expand All @@ -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'];
}

/**
Expand All @@ -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,
};
Expand All @@ -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',
},
},
};
Expand All @@ -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;
32 changes: 16 additions & 16 deletions packages/api/src/util/ensemble.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

/**
Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand All @@ -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 = {
Expand All @@ -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;
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand Down

0 comments on commit 7dec502

Please sign in to comment.