* Replace request by fetch
* Promisify `dropboxDuplicateProjectNames`
* Promisify `dropboxUnlinkedDueToLapsedReconfirmation`
* Promisify `featuresUpgradedByAffiliation`
* Promisify `redundantPersonalSubscription`
* Promisify `projectInvite`
* Promisify `ipMatcherAffiliation`
* Promisify `tpdsFileLimit`
* Promisify `groupInvitation`
* Promisify `personalAndGroupSubscriptions`
* Sanitize URL
* Add default fetch timeout
* Update tests
* Update tests with fetch-utils
* Update external usage
* Import `ObjectId` from `mongodb-legacy`
Co-authored-by: Alf Eaton <alf.eaton@overleaf.com>
* Add `toString()` to userId in `ipMatcherAffiliation` calls
* [v1] Return "200 null" instead of no content in `v2/api/v2/users/:userId/ip_matcher` when there is no data, so it can be read as JSON in the frontend
Can't be 204 because of lint: "Do not specify body content for a response with a non-content status code"
* Temporarily remove `enrolment_ad_html` test to test notifications
* Revert "Temporarily remove `enrolment_ad_html` test to test notifications"
This reverts commit fb8b0c26a3adbbc64053cd3f5f2570ccc97328fb.
* Use `return await`
Co-authored-by: Andrew Rumble <andrew.rumble@overleaf.com>
---------
Co-authored-by: Alf Eaton <alf.eaton@overleaf.com>
Co-authored-by: Andrew Rumble <andrew.rumble@overleaf.com>
GitOrigin-RevId: 17ee861852aa4ac15d3b46b1b28c763fad5333d2