Skip to content

Commit e0d9f4b

Browse files
committed
chore: [AB#17345] remove user feedback Airtable integration
The `user.userTesting` boolean continues to be stored in the production database via the standard `UpdateQueue` flow, but it is no longer synced to Airtable.
1 parent 683a18d commit e0d9f4b

22 files changed

+6
-599
lines changed

api/src/api/externalEndpointRouter.test.ts

Lines changed: 2 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { externalEndpointRouterFactory } from "@api/externalEndpointRouter";
2-
import { AddNewsletter, AddToUserTesting, DatabaseClient } from "@domain/types";
2+
import { AddNewsletter, DatabaseClient } from "@domain/types";
33
import { setupExpress } from "@libs/express";
44
import { DummyLogWriter } from "@libs/logWriter";
55
import { generateUser, generateUserData } from "@shared/test";
@@ -37,7 +37,6 @@ describe("externalEndpointRouter", () => {
3737
let app: Express;
3838
let stubDynamoDataClient: jest.Mocked<DatabaseClient>;
3939
let stubAddNewsletter: jest.MockedFunction<AddNewsletter>;
40-
let stubAddToUserTesting: jest.MockedFunction<AddToUserTesting>;
4140

4241
beforeEach(async () => {
4342
stubDynamoDataClient = {
@@ -50,16 +49,8 @@ describe("externalEndpointRouter", () => {
5049
findBusinessesByHashedTaxId: jest.fn(),
5150
};
5251
stubAddNewsletter = jest.fn();
53-
stubAddToUserTesting = jest.fn();
5452
app = setupExpress(false);
55-
app.use(
56-
externalEndpointRouterFactory(
57-
stubDynamoDataClient,
58-
stubAddNewsletter,
59-
stubAddToUserTesting,
60-
DummyLogWriter,
61-
),
62-
);
53+
app.use(externalEndpointRouterFactory(stubDynamoDataClient, stubAddNewsletter, DummyLogWriter));
6354
jest.spyOn(DummyLogWriter, "LogInfo").mockImplementation(() => {});
6455
jest.spyOn(DummyLogWriter, "LogError").mockImplementation(() => {});
6556
});
@@ -136,71 +127,5 @@ describe("externalEndpointRouter", () => {
136127
);
137128
});
138129
});
139-
140-
describe("userTesting", () => {
141-
it("adds to userTesting if userTesting is set to true and externalStatus is empty", async () => {
142-
const userData = generateUserData({
143-
user: generateUser({
144-
externalStatus: { newsletter: { status: "IN_PROGRESS" } },
145-
userTesting: true,
146-
}),
147-
});
148-
await request(app).post(`/userTesting`).send(userData);
149-
expect(stubAddToUserTesting).toHaveBeenCalled();
150-
});
151-
152-
it("does not add to userTesting if the request has been attempted", async () => {
153-
const userData = generateUserData({
154-
user: generateUser({
155-
externalStatus: { userTesting: { status: "IN_PROGRESS" } },
156-
userTesting: true,
157-
}),
158-
});
159-
await request(app).post(`/userTesting`).send(userData);
160-
expect(stubAddToUserTesting).not.toHaveBeenCalled();
161-
expect(DummyLogWriter.LogInfo).toHaveBeenCalledWith(
162-
expect.stringContaining("successfully updated user testing preferences for userId:"),
163-
);
164-
});
165-
166-
it("adds to newsletter and does not update the db if the user is unauthenticated", async () => {
167-
const userData = generateUserData({
168-
user: generateUser({ id: "123", externalStatus: {}, userTesting: true }),
169-
});
170-
await request(app).post(`/userTesting`).send(userData);
171-
expect(stubAddToUserTesting).toHaveBeenCalled();
172-
expect(stubDynamoDataClient.put).not.toHaveBeenCalled();
173-
});
174-
175-
it("logs no update needed and does not call addToUserTesting when no update is needed", async () => {
176-
const userData = generateUserData({
177-
user: generateUser({
178-
externalStatus: { userTesting: { status: "IN_PROGRESS" } },
179-
userTesting: true,
180-
}),
181-
});
182-
183-
await request(app).post(`/userTesting`).send(userData);
184-
185-
expect(stubAddToUserTesting).not.toHaveBeenCalled();
186-
expect(DummyLogWriter.LogInfo).toHaveBeenCalledWith(
187-
expect.stringContaining("no update to user testing preferences needed for userId"),
188-
);
189-
});
190-
191-
it("adds to newsletter and updates the db if the user is authenticated", async () => {
192-
const userData = generateUserData({
193-
user: generateUser({ id: "123", externalStatus: {}, userTesting: true }),
194-
});
195-
mockJwt.decode.mockReturnValue(cognitoPayload({ id: "123" }));
196-
stubDynamoDataClient.put.mockResolvedValue(userData);
197-
await request(app)
198-
.post(`/userTesting`)
199-
.send(userData)
200-
.set("Authorization", "Bearer user-123-token");
201-
expect(stubAddToUserTesting).toHaveBeenCalled();
202-
expect(stubDynamoDataClient.put).toHaveBeenCalled();
203-
});
204-
});
205130
});
206131
});
Lines changed: 1 addition & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { getSignedInUserId } from "@api/userRouter";
22
import { shouldAddToNewsletter } from "@domain/newsletter/shouldAddToNewsletter";
3-
import { AddNewsletter, AddToUserTesting, DatabaseClient } from "@domain/types";
4-
import { shouldAddToUserTesting } from "@domain/user-testing/shouldAddToUserTesting";
3+
import { AddNewsletter, DatabaseClient } from "@domain/types";
54
import { getDurationMs } from "@libs/logUtils";
65
import type { LogWriterType } from "@libs/logWriter";
76
import { UserData } from "@shared/userData";
@@ -11,7 +10,6 @@ import { StatusCodes } from "http-status-codes";
1110
export const externalEndpointRouterFactory = (
1211
databaseClient: DatabaseClient,
1312
addNewsletter: AddNewsletter,
14-
addToUserTesting: AddToUserTesting,
1513
logger: LogWriterType,
1614
): Router => {
1715
const router = Router();
@@ -69,57 +67,5 @@ export const externalEndpointRouterFactory = (
6967
res.status(StatusCodes.OK).json(userData);
7068
});
7169

72-
router.post("/userTesting", async (req, res) => {
73-
const method = req.method;
74-
const endpoint = req.originalUrl;
75-
const requestStart = Date.now();
76-
77-
let userData = req.body as UserData;
78-
const userId = userData.user.id;
79-
let isAnonymous;
80-
try {
81-
isAnonymous = getSignedInUserId(req) !== userId;
82-
} catch {
83-
isAnonymous = true;
84-
}
85-
86-
if (shouldAddToUserTesting(userData)) {
87-
userData = await addToUserTesting(userData);
88-
if (!isAnonymous) {
89-
try {
90-
userData = await databaseClient.put(userData);
91-
} catch (error) {
92-
const status = StatusCodes.INTERNAL_SERVER_ERROR;
93-
const message = error instanceof Error ? error.message : "Unexpected error";
94-
logger.LogError(
95-
`${method} ${endpoint} - Failed to update user: ${message}, status: ${status}, userId: ${userId}, duration: ${getDurationMs(
96-
requestStart,
97-
)}ms`,
98-
);
99-
res.status(status).json({ error: message });
100-
return;
101-
}
102-
}
103-
104-
logger.LogInfo(
105-
`[END] ${method} ${endpoint} - status: ${
106-
StatusCodes.OK
107-
}, successfully updated user testing preferences for userId: ${userId}, duration: ${getDurationMs(
108-
requestStart,
109-
)}ms`,
110-
);
111-
} else {
112-
logger.LogInfo(
113-
`[END] ${method} ${endpoint} - status: ${
114-
StatusCodes.OK
115-
}, no update to user testing preferences needed for userId: ${userId}, duration: ${getDurationMs(
116-
requestStart,
117-
)}ms`,
118-
);
119-
}
120-
121-
res.status(StatusCodes.OK).json(userData);
122-
});
123-
12470
return router;
12571
};

api/src/client/AirtableUserTestingClient.test.ts

Lines changed: 0 additions & 83 deletions
This file was deleted.

api/src/client/AirtableUserTestingClient.ts

Lines changed: 0 additions & 61 deletions
This file was deleted.

api/src/db/DynamoUserDataClient.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,6 @@ export const DynamoUserDataClient = (
131131
return search(statement);
132132
};
133133

134-
const getNeedToAddToUserTestingUsers = (): Promise<UserData[]> => {
135-
const statement = `SELECT data FROM "${tableName}" WHERE data["user"].userTesting = true and (data["user"].externalStatus.userTesting is missing or data["user"].externalStatus.userTesting.success = false)`;
136-
return search(statement);
137-
};
138-
139134
const getNeedTaxIdEncryptionUsers = (): Promise<UserData[]> => {
140135
const statement = `SELECT data FROM "${tableName}" WHERE data["profileData"].encryptedTaxId IS MISSING AND data["profileData"].taxId IS NOT MISSING`;
141136
return search(statement);
@@ -181,7 +176,6 @@ export const DynamoUserDataClient = (
181176
put,
182177
findByEmail,
183178
getNeedNewsletterUsers,
184-
getNeedToAddToUserTestingUsers,
185179
getNeedTaxIdEncryptionUsers,
186180
getUsersWithOutdatedVersion,
187181
};

api/src/domain/newsletter/addNewsletterBatch.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ describe("addNewsletterBatch", () => {
1717
put: jest.fn(),
1818
findByEmail: jest.fn(),
1919
getNeedNewsletterUsers: jest.fn(),
20-
getNeedToAddToUserTestingUsers: jest.fn(),
2120
getNeedTaxIdEncryptionUsers: jest.fn(),
2221
getUsersWithOutdatedVersion: jest.fn(),
2322
};

api/src/domain/types.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
} from "@businessnjgovnavigator/shared";
1313
import { REMINDER_EMAIL_CONFIG_SET_BASE, WELCOME_EMAIL_CONFIG_SET_BASE } from "@libs/constants";
1414
import { NameAvailability, NameAvailabilityResponse } from "@shared/businessNameSearch";
15-
import { BusinessUser, NewsletterResponse, UserTestingResponse } from "@shared/businessUser";
15+
import { BusinessUser, NewsletterResponse } from "@shared/businessUser";
1616
import { TaxFilingCalendarEvent } from "@shared/calendarEvent";
1717
import {
1818
EmailConfirmationResponse,
@@ -41,7 +41,6 @@ import {
4141
LicenseEntity,
4242
LicenseSearchNameAndAddress,
4343
} from "@shared/license";
44-
import { ProfileData } from "@shared/profileData";
4544
import { TaxFilingLookupState, TaxFilingOnboardingState } from "@shared/taxFiling";
4645
import { Business, UserData } from "@shared/userData";
4746
import { AxiosResponse } from "axios";
@@ -90,7 +89,6 @@ export interface UserDataClient {
9089
findByEmail: (email: string) => Promise<UserData | undefined>;
9190
put: (userData: UserData) => Promise<UserData>;
9291
getNeedNewsletterUsers: () => Promise<UserData[]>;
93-
getNeedToAddToUserTestingUsers: () => Promise<UserData[]>;
9492
getNeedTaxIdEncryptionUsers: () => Promise<UserData[]>;
9593
getUsersWithOutdatedVersion: (
9694
latestVersion: number,
@@ -172,7 +170,6 @@ export interface TimeStampBusinessSearch {
172170
export type EncryptTaxId = (userData: UserData) => Promise<UserData>;
173171

174172
export type AddNewsletter = (userData: UserData) => Promise<UserData>;
175-
export type AddToUserTesting = (userData: UserData) => Promise<UserData>;
176173

177174
export interface LicenseStatusClient {
178175
search: (name: string, zipCode: string) => Promise<LicenseEntity[]>;
@@ -183,10 +180,6 @@ export interface EmployerRatesClient {
183180
getEmployerRates: (employerRatesRequest: EmployerRatesRequest) => Promise<EmployerRatesResponse>;
184181
}
185182

186-
export interface UserTestingClient {
187-
add: (user: BusinessUser, profileData: ProfileData) => Promise<UserTestingResponse>;
188-
}
189-
190183
export interface SelfRegClient {
191184
grant: (user: BusinessUser) => Promise<SelfRegResponse>;
192185
resume: (authID: string) => Promise<SelfRegResponse>;

0 commit comments

Comments
 (0)