From fc85af62e977f41d9a787f18f87fb370197d42a8 Mon Sep 17 00:00:00 2001 From: linyc Date: Fri, 15 Sep 2023 17:19:22 +0800 Subject: [PATCH] refactor: :art: Refactor getUserFixedTags and add edge case handling --- .../src/__test__/graphql_integration.test.js | 72 +++++++++++-------- .../src/datasources/TagResearchDataSource.js | 43 ++++++----- 2 files changed, 71 insertions(+), 44 deletions(-) diff --git a/apollo/src/__test__/graphql_integration.test.js b/apollo/src/__test__/graphql_integration.test.js index 8e6c9b4..5fb41b8 100644 --- a/apollo/src/__test__/graphql_integration.test.js +++ b/apollo/src/__test__/graphql_integration.test.js @@ -726,7 +726,18 @@ describe('test graphql query', () => { longitude: '120.99719144686011', }, }; + const docData2 = { + groupId: -1, + locationName: '活動中心&一餐2', + coordinates: { + latitude: '24.789345225611136', + longitude: '120.99719144686011', + }, + }; const docRef = await firestore.collection('fixedTag_research').add(docData); + const docRef2 = await firestore + .collection('fixedTag_research') + .add(docData2); const collectionRef = firestore.collection('tagData_research'); const defaultStatus = { @@ -804,34 +815,39 @@ describe('test graphql query', () => { 'getUserFixedTagResearchList', { uNumber: 11 } ); - expect(queryResult.fixedTags[0]).toHaveProperty('id', docRef.id); - expect(queryResult.fixedTags[0]).toHaveProperty( - 'locationName', - docData.locationName - ); - expect(queryResult.fixedTags[0]).toHaveProperty( - 'coordinates', - docData.coordinates - ); - const fixedTagSubTagsResult = {}; - queryResult.fixedTags[0].tags.forEach(location => { - fixedTagSubTagsResult[location.id] = location; - }); - // console.log(fixedTagSubTagsResult[tagDocRef.id].statusHistory); - const statusExpectData = { - statusName: '清潔狀態', - statusDescName: '乾淨', - createTime: expect.stringMatching(timestampStringRegex), - }; - expect(fixedTagSubTagsResult[tagDocRef.id]).toMatchObject({ - ...tagData, - id: tagDocRef.id, - fixedTagId: docRef.id, - status: statusExpectData, - statusHistory: { - statusList: [statusExpectData], - }, - }); + + if (queryResult.fixedTags.length < 2) { + expect(queryResult.fixedTags[0]).toHaveProperty('id', docRef2.id); + } else { + expect(queryResult.fixedTags[0]).toHaveProperty('id', docRef.id); + expect(queryResult.fixedTags[0]).toHaveProperty( + 'locationName', + docData.locationName + ); + expect(queryResult.fixedTags[0]).toHaveProperty( + 'coordinates', + docData.coordinates + ); + const fixedTagSubTagsResult = {}; + queryResult.fixedTags[0].tags.forEach(location => { + fixedTagSubTagsResult[location.id] = location; + }); + // console.log(fixedTagSubTagsResult[tagDocRef.id].statusHistory); + const statusExpectData = { + statusName: '清潔狀態', + statusDescName: '乾淨', + createTime: expect.stringMatching(timestampStringRegex), + }; + expect(fixedTagSubTagsResult[tagDocRef.id]).toMatchObject({ + ...tagData, + id: tagDocRef.id, + fixedTagId: docRef.id, + status: statusExpectData, + statusHistory: { + statusList: [statusExpectData], + }, + }); + } // also test one fixed tag query const queryFixedTag = gql` diff --git a/apollo/src/datasources/TagResearchDataSource.js b/apollo/src/datasources/TagResearchDataSource.js index 37426b0..7635daa 100644 --- a/apollo/src/datasources/TagResearchDataSource.js +++ b/apollo/src/datasources/TagResearchDataSource.js @@ -113,20 +113,32 @@ class TagResearchDataSource extends DataSource { } async getUserFixedTags(uNumber, pageParams) { - let query; - if (uNumber < 25) { - query = this.fixedTagResearchCollectionRef - .where('groupId', '==', 1) - .orderBy('__name__'); - } else if (uNumber >= 25 && uNumber < 48) { - query = this.fixedTagResearchCollectionRef - .where('groupId', '==', 2) - .orderBy('__name__'); - } else if (uNumber >= 48) { - query = this.fixedTagResearchCollectionRef - .where('groupId', '==', 3) - .orderBy('__name__'); + // seperate users into three groups + const groupIds = { + group1: [1, -1], + group2: [2, -1], + group3: [3, -1], + groupDefault: [-1], + }; + + // get groupIds by uNumber + let selectedGroupIds; + + if (uNumber < 25 && uNumber > 0) { + selectedGroupIds = groupIds.group1; + } else if (uNumber >= 25 && uNumber < 49) { + selectedGroupIds = groupIds.group2; + } else if (uNumber >= 49 && uNumber < 73) { + selectedGroupIds = groupIds.group3; + } else { + selectedGroupIds = groupIds.groupDefault; } + + // get query by groupIds + const query = this.fixedTagResearchCollectionRef + .where('groupId', 'in', selectedGroupIds) + .orderBy('__name__'); + const { data: fixedTags, pageInfo } = await getPage( query, pageParams, @@ -146,9 +158,8 @@ class TagResearchDataSource extends DataSource { .doc(fixedTagId) .get(); const fixedTagLocation = docSnap.data().locationName; - const matchingLocation = locationNameToCoordinates.find( - // location => location.locationName === fixedTagLocation - location => fixedTagLocation.includes(location.locationName) + const matchingLocation = locationNameToCoordinates.find(location => + fixedTagLocation.includes(location.locationName) ); // for the location missing if (!matchingLocation) {