* Add some JSDoc types to `@overleaf/logger`
* Update `logger.error` calls
* Fixup `logger.err` JSDoc
* Update `logger.err` calls
* Fix `args` type
* Remove "Error message" description
* Replace `arguments` by actual arguments of the method
* Fix: "ESLint: Unnecessary '.apply()'.(no-useless-call)"
* Add JSDoc params to `debug` `info` `warn`
* Remove extra `args` param in JSDoc so developers aren't invited to use it
Not sure if this is the best thing to do because it creates a warning in the IDE: "Parameter args is not described in JSDoc"
* Add comment about serialization of `err` `req` `res`
* Allow strings as first param in `debug` `info` `warn`
* Fix syntax for optional parameters in JSDoc
* Add 2 signatures, to avoid "string, string" params
* Fix `@signature` names copy-pastes
Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>
* Revert the double `@param attributes`. It doesn't work
---------
Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>
GitOrigin-RevId: 086dee8bbf30d577c5e1f844a9df5e518c46aca7
* Don't send status 200 in the beginning: we may throw later
This was causing `Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client`
https://cloudlogging.app.goo.gl/Bchegw2iCYLxhPNk8
* Continue when failing to send one email, but log the error
* Revert "Don't send status 200...", log error instead
This reverts commit 3e13559704f822e330a18a68567f46491649f222.
* Fix `logger.error` params
* Fixup: good syntax for `logger.error`
* Remove useless `OError` import
* Update services/web/modules/metrics/app/src/MetricsEmailController.js
Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>
* Update services/web/modules/metrics/app/src/MetricsEmailController.js
Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>
* Update services/web/modules/metrics/app/src/MetricsEmailController.js
Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>
* Update services/web/scripts/recurly/collect_paypal_past_due_invoice.js
Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>
---------
Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>
GitOrigin-RevId: c68bc677326729fc6c39b7c2f027e35ebb776bd2
* Create `getPaginatedEndpointIterator` to iterate each page
* Create `waitMs` util, it will replace `slowCallback`
* Make `handleAPIError` async
* Make `isAccountUsingPaypal` async
* Make `attemptInvoiceCollection` async
* Make `attemptInvoicesCollection` async
* Use `await` instead of `new Promise`
* Remove unused callbackified `attemptInvoiceCollection`
* Run `attemptInvoiceCollection` for each page instead of gathering all pages in the beginning
* Add test on fetching multiple pages of invoice
GitOrigin-RevId: 2674b18c6ca5732b873fb2bc71b515909006f93d
* Rename `RecurlyWrapper` to `promises`, as it will only contain the promises soon
* Update `apiRequest`
* Update `_parseXml`
* Update `_parseXmlAndGetAttribute`
* Update `_parse*Xml`
* Update `updateAccountEmailAddress`
* Update `checkAccountExists`
* Update `createAccount`
* Update `createBillingInfo`
* Update `setAddressAndCompanyBillingInfo`
* Update `createSubscription`
* Update `_createPaypalSubscription`
* Update `_handle422Response`
* Update `_createCreditCardSubscription`
* Update `createSubscription`
* Update `getSubscriptions`
* Update `getSubscription`
* Update `getPaginatedEndpoint`
* Update `getAccount`
* Update `getAccountActiveCoupons`
* Update `getCoupon`
* Update `getBillingInfo`
* Update `getAccountPastDueInvoices`
* Update `attemptInvoiceCollection`
* Update `updateSubscription`
* Update `createFixedAmmountCoupon`
* Update `lookupCoupon`
* Update `redeemCoupon`
* Update `extendTrial`
* Update `listAccountActiveSubscriptions`
* To find which functions to add as callbackified, I used this Regex:
`RecurlyWrapper\.(?!promises)[^.\s]*`
And after adding callbackified functions, we're left with no results with the Regex:
`RecurlyWrapper\.(?!promises|apiUrl|_buildXml|_parseXml|attemptInvoiceCollection|createFixedAmmountCoupon|getAccountActiveCoupons|getBillingInfo|getPaginatedEndpoint|getSubscription|updateAccountEmailAddress)[^.\s]*`
* Update unit tests
* Test `getSubscription` both as "promise" and as "callback"
I'm not sure if we want to generalize this.
* Fix: add missing `await`s (!!)
* Change `apiRequest` to reject errors instead of resolving it in an object
* Fixup for CollectPayPalPastDueInvoice test
* Fix: callbackify `getSubscriptions` (!!)
* Replace `.then(...)` chain by multiple `await`
* Fixup `attemptInvoicesCollection`: prevent reading length of undefined
* Use `return await` when returning promises
Per https://github.com/overleaf/internal/pull/18384#pullrequestreview-2065738771
GitOrigin-RevId: ceda755b24fd29f97a27e60ac5db9bc7e369f932
* Fix `revokeAllUserSessions` call in `_cleanupUser`
The user object should be passed, not the _id
* Change `revokeAllUserSessions` signature, take `req` and `stayLoggedIn` arguments
* Update uses of `revokeAllUserSessions`
* Fix promisified `revokeAllUserSessions` args
* Update tests
* Destroy or Regenerate the session in the end of `revokeAllUserSessions`
Per https://github.com/overleaf/internal/issues/17036#issuecomment-1938398570
* Revert "Destroy or Regenerate the session in the end of `revokeAllUserSessions`"
This reverts commit fe30734dbe45b27d2931d2e43a711d591bb85787.
* Rename `revokeAllUserSessions` to `removeSessionsFromRedis`
* Fixup tests
* Fix: add optional chaining in `req.sessionID` (!!)
GitOrigin-RevId: d41676bf00f463230af495e09c65fb9ee521f49f
* Fix: Invoices collected array length comparison
Update the code with the correct condition to respect the intent of the previous implementation ("exit with non zero code when no invoicess were processed").
See 5476f39984
However, I'm not sure if erroring when no invoices are collected is actually what we want to do.
* Wrap `collect_paypal_past_due_invoice` script and export the function
* Fixup typo `accoutns`
* Log invoices collection data before throwing
* Add note: `handleAPIError` is silencing the errors
* Create a test on `collect_paypal_past_due_invoice`
* Replace `console.log` by `@overleaf/logger` (bunyan)
Our `console.warn` show up as Errors (in red) in GCP. For example the following is an error in GCP:
```
Errors in attemptInvoiceCollection with id=2693634 OError: Recurly API returned with status code: 400
```
https://github.com/overleaf/internal/blob/5476f39/services/web/scripts/recurly/collect_paypal_past_due_invoice.js#L9
---
Does it correctly set the levels as warnings if we use `@overleaf/logger`
GitOrigin-RevId: 37c8bdf4afd8cef4706700aafb44480ec8966a74
* Copy `migration_compile_timeout_60s_to_20s.js` script
* Update `featuresUpdatedAt`
* Add a comment about `featuresUpdatedAt` in migration_compile_timeout_60s_to_20s.js
* Fix test on migration_compile_timeout_60s_to_20s.js
* Fix: Include users having `featuresUpdatedAt` undefined in the update
* Add test on `migration_compile_timeout_60s_to_20s_fixup_features_updated_at`
GitOrigin-RevId: 4b2baf955a6a9f39bf9ce00b7839af551064c6cb
* Add a unit test on `SubscriptionFormatters.formatPrice`
* Add JSDoc to `formatPrice`
Also: Name the functions before exporting:
This fixes my IDE (WebStorm) navigation
* Make `'USD'` the default param instead of reassigning
* Create `formatCurrency` function
* Use `formatCurrency` in SubscriptionFormatters
* Use an `isNoCentsCurrency` logic for `CLP` `JPY` `KRW` `VND`
And remove custom `CLP` logic and locale
* Add `locale` param to `formatPrice`
* Generate `groups.json` and `localizedPlanPricing.json`
```
bin/exec web node ./scripts/recurly/recurly_prices.js --download -o prices.json
bin/exec web node ./scripts/plan-prices/plans.js -f ../../prices.json -o dir
```
* Update scripts/plan-prices/plans.js to generate numbers instead of localized amounts
* Generate `groups.json` and `localizedPlanPricing.json`
```
bin/exec web node ./scripts/recurly/recurly_prices.js --download -o prices.json
bin/exec web node ./scripts/plan-prices/plans.js -f ../../prices.json -o dir
```
* Remove generation of `plans.json`
As /services/web/frontend/js/main/plans.js was removed in https://github.com/overleaf/internal/pull/12593
* Sort currencies in alphabetical order in scripts/plan-prices/plans.js
* Generate `groups.json` and `localizedPlanPricing.json`
```
bin/exec web node ./scripts/recurly/recurly_prices.js --download -o prices.json
bin/exec web node ./scripts/plan-prices/plans.js -f ../../prices.json -o dir
```
* Use `formatCurrency` in price-summary.tsx
* Use `formatCurrency` in Subscription Pug files
* Fix unit tests SubscriptionHelperTests.js
* Remove unused `currencySymbol`
* Change to `formatCurrency` in other React components
* Add `CurrencyCode` JSDoc types
* Duplicate `formatCurrency` into services/web/app/src/util
* Wrap tests in a top-level describe block
* Use `narrowSymbol`
* Fix tests with `narrowSymbol` expects
* Revert deletion of old `formatPrice` in SubscriptionFormatters.js
* Rename `formatCurrency` -> `formatCurrencyLocalized`
* Revert deletion of `CurrencySymbol`
* Add split-test in SubscriptionController.js
* Add split-test in SubscriptionViewModelBuilder.js
* Add split-test in plans
* Add split-test in subscription-dashboard-context.tsx
* Add split-test in 4 more components
* Update tests
* Show currency and payment methods in interstitial page
* Fix `–` being printed. Use `–` instead
* Fix test with NOK
* Storybook: Fix missing `SplitTestProvider`
* Storybook: Revert "Remove unused `currencySymbol`"
This reverts commit e55387d4753f97bbf8e39e0fdc3ad17312122aaa.
* Replace `getSplitTestVariant` by `useSplitTestContext`
* Use parameterize currencyFormat in `generateInitialLocalizedGroupPrice`
* Fixup import paths of `formatCurrencyLocalized`
* Replace `% 1 === 0` by `Number.isInteger`
* Add comment explaining that any combinations of languages/currencies could happen
* Fixup after rebase: import `useSplitTestContext`
* Revert "Remove SplitTestProvider from subscription root"
This reverts commit be9f378fda715b86589ab0759737581c72321d87.
* Revert "Remove split test provider from some tests"
This reverts commit 985522932b550cfd38fa6a4f4c3d2ebaee6ff7df.
GitOrigin-RevId: 59a83cbbe0f7cc7e45f189c654e23fcf9bfa37af
* Create a script to extract OnboardingDataCollection
* Add `userId` to the CSV
* Add `firstName` and `lastName` booleans to the CSV
GitOrigin-RevId: ad1c8b9f88358553651f55563dad597767ab7a88