Skip to content

17 roles#3

Merged
techla merged 3 commits intopierreb-devkit:devfrom
techla:17-roles
Mar 22, 2018
Merged

17 roles#3
techla merged 3 commits intopierreb-devkit:devfrom
techla:17-roles

Conversation

@techla
Copy link
Copy Markdown
Contributor

@techla techla commented Mar 22, 2018

No description provided.

@techla techla merged commit 8207831 into pierreb-devkit:dev Mar 22, 2018
@techla techla deleted the 17-roles branch March 22, 2018 08:39
PierreBrisorgueil added a commit that referenced this pull request Jul 25, 2020
PierreBrisorgueil pushed a commit that referenced this pull request Jul 25, 2020
# 1.0.0 (2020-07-25)

### Bug Fixes

* **apis:** fix due to lou change 🐛 ([c32a484](c32a484))
* **apis:** fix duplicate save 🐛 ([6448b85](6448b85))
* **apis:** fix mapping / typing diff 🐛 ([dbcc06b](dbcc06b))
* **apis:** fix schema valid array 🐛 ([8a4cd99](8a4cd99))
* **apis:** quick fix on date 🐛 ([a53082f](a53082f))
* **auth:** message sign in 🐛 ([96f8435](96f8435))
* **config:** fix git ignore 🐛 ([3d2ab35](3d2ab35))
* **config:** fix mongoose settings 🐛 ([41263da](41263da))
* **config:** set no ssl by default (default = no certs) 🐛 ([4c798b0](4c798b0))
* **config:** update old config 🐛 ([72232a6](72232a6))
* **config,lib:** fix assets allJs files 🐛 ([452ee92](452ee92))
* **debug:** fixing gulp node debug task ([#1689](#1689)) ([531e3a1](531e3a1))
* **dependencies:** fix package lock 🐛 ([a3a35b6](a3a35b6))
* **dependencies:** fix package lock 🐛 ([f31d857](f31d857))
* **dependencies:** remove pm2 as default, responsible of 2 snyk 🐛 ([e682eee](e682eee))
* **dependencies:** tempo downgrade winston: winstonjs/winston#1814 🐛 ([41c35c6](41c35c6))
* **deps:** fix snyk version 🐛 ([ab68290](ab68290))
* **environment:** setting `test.js` environment for the sequlize orm to be `meantest` instead of `me ([bf3361e](bf3361e))
* **global:** count warning 🐛 ([e00f396](e00f396))
* **global:** default html send fixed 🐛 ([3a63aae](3a63aae))
* **global:** fix database configuration 🐛 ([e5413d6](e5413d6))
* **global:** fix knowledges style 👕 ([a72386d](a72386d))
* **global:** fix lint 🐛 ([79654a0](79654a0))
* **global:** purge useless file 🐛 ([d79ab55](d79ab55))
* **gulp:** fixing gulp-ava task usage which didnt return the stream which is why it didnt emit the ' ([3a36de1](3a36de1))
* **helpers:** align & review 🐛 ([42a68f3](42a68f3))
* **helpers:** fix $position of insert new data history 🐛 ([70a728c](70a728c))
* **helpers:** fix mails error catch ([07ebd21](07ebd21))
* **helpers, apis:** fix save 🐛 ([e036f67](e036f67))
* **jwt:** env variable name change for jwt secret ([ad651b9](ad651b9))
* **lib:** hot fix app init 🐛 ([7e6b36c](7e6b36c))
* **lib:** mongoose services mistake ... exhausted O.O 🐛 ([a5da7be](a5da7be))
* **lib:** show error if db initialization failed 🐛 ([f962a57](f962a57))
* **logger:** fix re-instantiation of winston loggers on method calls ([b6056fb](b6056fb))
* **mongoose:** fixing mongoose deprecation notice for promises library integration ([#1690](#1690)) ([008ec75](008ec75))
* **package:** tempos downgrade jest 🐛 ([e5f7085](e5f7085))
* **package:** update bcrypt to version 4.0.0 ([927d7c8](927d7c8))
* **package:** update chalk to version 3.0.0 ([54b4ac7](54b4ac7))
* **package:** update chalk to version 4.0.0 ([91ae908](91ae908))
* **package:** update cross-env to version 6.0.0 ([cc27101](cc27101))
* **package:** update cross-env to version 7.0.0 ([b7118b2](b7118b2))
* **package:** update generate-password to version 1.5.0 ([76cf130](76cf130))
* **package:** update google-auth-library to version 4.0.0 ([87e9744](87e9744))
* **package:** update google-auth-library to version 5.0.0 ([66fb57b](66fb57b))
* **package:** update google-auth-library to version 6.0.0 ([fede55b](fede55b))
* **package:** update helmet to version 3.16.0 ([3174d74](3174d74))
* **package:** update helmet to version 3.17.0 ([cc8c011](cc8c011))
* **package:** update helmet to version 3.18.0 ([1b06692](1b06692))
* **package:** update helmet to version 3.19.0 ([15afcdd](15afcdd))
* **package:** update helmet to version 3.20.0 ([b61747e](b61747e))
* **package:** update helmet to version 3.21.0 ([7eab8e4](7eab8e4))
* **package:** update idtoken-verifier to version 2.0.0 ([5353083](5353083))
* **package:** update mongoose to version 5.7.0 ([cc3929c](cc3929c))
* **package:** update mongoose to version 5.8.0 ([0b56522](0b56522))
* **package:** update mongoose to version 5.9.0 ([48e28aa](48e28aa))
* **package:** update nodemailer to version 6.4.0 ([beb9647](beb9647))
* **package:** update nodemon to version 2.0.0 ([1bd18aa](1bd18aa))
* **package:** update pm2 to version 4.0.0 ([428c559](428c559))
* **release:** url 🐛 ([c09c8c4](c09c8c4))
* **scripts:** add missing scripts 🐛 ([f175944](f175944))
* **scripts:** fix file name 🐛 ([4917832](4917832))
* **scripts:** fix scripts path 🐛 ([eef9078](eef9078))
* **tests:** try fix coveralls 🐛 ([5900177](5900177))
* **travis:** fix tests 🐛 ([2db3c58](2db3c58))
* **travis:** macosx travis services mongodb no longer available  🐛 ([fcabc8b](fcabc8b))
* **typing:** fix DATE_NEXT_DAY hours 🐛 ([52038b8](52038b8))
* **user:** fix optionnal 🐛 ([f76b66f](f76b66f))
* **users:** add uploads to data privacy mail 🐛 ([6e5d63b](6e5d63b))
* **users:** fix mail contact in templates 🐛 ([e49839a](e49839a))
* **users:** fix optionnal on /me 🐛 ([7675944](7675944))
* **users:** fix some comments 🐛 ([80e4b7d](80e4b7d))
* **users:** review schema & /me return 🐛 ([206902f](206902f))
* **users:** security review, filter user data return by default 🐛 ([af800d1](af800d1))
* .snyk to reduce vulnerabilities ([662e3ad](662e3ad))
* package.json & package-lock.json to reduce vulnerabilities ([709fac7](709fac7))
* package.json & package-lock.json to reduce vulnerabilities ([3319966](3319966))
* package.json & package-lock.json to reduce vulnerabilities ([dd135aa](dd135aa))
* **dependencies:** package.lock update 🐛 ([4e3442d](4e3442d))
* **global:** express warning 🐛 ([250b0af](250b0af))
* **package:** update mock-fs to version 4.8.0 ([ed1c772](ed1c772))
* **package:** update mongoose to version 5.6.0 ([f85ffc3](f85ffc3))
* **package:** update nodemailer to version 6.2.1 ([58b917a](58b917a))
* **package:** update nodemailer to version 6.3.0 ([4e92a66](4e92a66))
* **package:** update snyk to version 2.0.0 ([610b0d6](610b0d6))
* package.json & package-lock.json to reduce vulnerabilities ([b2016cf](b2016cf))
* **helpers:** fix error format 🐛 ([0e38c59](0e38c59))
* **package:** update joi-zxcvbn to version 5.0.0 ([b179907](b179907))
* **package:** update mongoose to version 5.5.0 ([c3dceee](c3dceee))
* **package:** update nodemailer to version 6.0.0 ([dd0558f](dd0558f))
* **package:** update nodemailer to version 6.1.0 ([4e58232](4e58232))
* **seed:** gulp task `test:seed` would hang on the gulp node process and not exit ([075e66c](075e66c))
* **sequelize:** fixing error handling in in sequelize lib instantiation ([02608a2](02608a2))
* **server:** fixing un-handled promise rejections when initaitlizing the app ([f73ec2b](f73ec2b))
* **tasks:** fixing tasks controller to use `req.user` as the storage of logged-in user details ([7430140](7430140))
* **tasks:** quick fix on model to authorize empty strings 🐛 ([fd0ddb8](fd0ddb8))
* **tasks:** quick fix TODO 🐛 ([8cf75ab](8cf75ab))
* **tests:** upgrade supertest to fix tests 🐛 ([5ba0624](5ba0624))
* **travis:** fix path and names 🐛 ([1ea863b](1ea863b))
* package.json & package-lock.json to reduce vulnerabilities ([a1adbe8](a1adbe8))
* **package:** update sequelize to version 5.1.0 ([8aa77db](8aa77db))
* **package:** update supertest to version 4.0.0 ([5de4f3f](5de4f3f))
* **tests:** refactoring tests to dismiss the supertest wrapper ([dc17715](dc17715))
* **users:** hide sensitive data from errors 🐛 ([2e07a90](2e07a90))
* **wiki:** links 📚 ([6101969](6101969))
* **yarn:** remove .lock, not updated by greenkeeper 🐛 ([6cc569b](6cc569b))
* .snyk to reduce vulnerabilities ([2ffe38a](2ffe38a))
* configure Snyk protect to enable patches ([9ca9600](9ca9600))
* package.json, package-lock.json & .snyk to reduce vulnerabilities ([935075d](935075d))

### Features

* **apis:** add autoRequest option ✨ ([761bdc7](761bdc7))
* **apis:** add cron & mail ✨ ([b58129e](b58129e))
* **apis:** add cron list request to services ✨ ([bae1c75](bae1c75))
* **apis:** add expiration & renew data if aggregate expired ✨ ([3086795](3086795))
* **apis:** add option to work without save ✨ ([ee88134](ee88134))
* **apis:** add path ✨ ([54e733c](54e733c))
* **apis:** add slug ✨ ([7ccb023](7ccb023))
* **apis:** add timestamp to data ✨ ([f4af8bd](f4af8bd))
* **apis:** add updated at date ✨ ([5468277](5468277))
* **apis:** add user dimension in history ✨ ([f3be4a2](f3be4a2)), closes [#3](#3)
* **apis:** auto detect merge key before save ✨ ([097056d](097056d))
* **apis:** clean code & add saving ✨ ([cea28f2](cea28f2))
* **apis:** clean some code ✨ ([632c538](632c538))
* **apis:** clean typing for meteo ✨ ([aef85b3](aef85b3))
* **apis:** first save ok ✨ ([a2676e3](a2676e3))
* **apis:** init aggregate ✨ ([1b19c03](1b19c03))
* **apis:** init get data road on api ✨ ([8d82a8e](8d82a8e))
* **apis:** init history ✨ ([683b33f](683b33f))
* **apis:** init mapping in apis ✨ ([c2eef4d](c2eef4d))
* **apis:** init module ✨ ([ec7edca](ec7edca))
* **apis:** init worker auto ✨ ([916597c](916597c))
* **apis:** limit data to 100 last ✨ ([a8307ef](a8307ef)), closes [#1](#1)
* **apis:** limit history size ✨ ([3a098e4](3a098e4))
* **apis:** new params settings ✨ ([c601325](c601325))
* **apis:** purge unset values during typing ✨ ([b84dea1](b84dea1))
* **apis:** review route and security ✨ ([4e6873d](4e6873d)), closes [#5](#5)
* **apis:** rework result ✨ ([6155968](6155968))
* **apis:** run worker auto if api auto request true ✨ ([43e46d1](43e46d1))
* **apis:** save in db for the first time :) ✨ ([787acf6](787acf6))
* **apis:** set api data request v0 ✨ ([b3c254a](b3c254a))
* **apis:** switch user for auto request ✨ ([1cc6901](1cc6901))
* **apis, helpers, config:** switch to service id, init request to lou ✨ ([6b3fad1](6b3fad1))
* **apis, historys:** set stats ✨ ([5ab49ea](5ab49ea))
* **apis, script:** set restore & purge db ✨ ([d530a4f](d530a4f))
* **auth:** add type & message for notification in sign in sign up ✨ ([4c7147d](4c7147d))
* **auth:** refactoring local user authentication strategy ([0689d0c](0689d0c))
* **ava:** initial project setup for ava test runner ([0f4da27](0f4da27))
* **commitizen): feat(commitizen:** introducing project support for commitizen ([f7acd13](f7acd13))
* **config:** add array management for systems var ✨ ([5e5ab52](5e5ab52))
* **config:** add config check and alert user if not ✨ ([0aeddbc](0aeddbc))
* **config:** add default cors ✨ ([77c3403](77c3403))
* **config:** change contact mail ✨ ([12b5532](12b5532))
* **config:** display cors at launch ✨ ([8758edc](8758edc))
* **config:** end mail config ✨ ([28fd56a](28fd56a))
* **config:** fix secret ✨ ([089ff7f](089ff7f))
* **config:** init montaine configuration ✨ ([3b8ffc7](3b8ffc7))
* **config:** rename config ✨ ([88d6934](88d6934))
* **config:** set restore exceptions ✨ ([bd6b6ec](bd6b6ec))
* **config:** upgrade ssl example ✨ ([cc0e4b5](cc0e4b5))
* **core:** add changelog releases routes ✨ ([57d9faf](57d9faf))
* **dependencies:** add inquirer for prompt message with gulp ✨ ([359bfa4](359bfa4))
* **dependencies:** add package lock ([10d4081](10d4081))
* **dependencies:** fix ✨ ([416b451](416b451))
* **dependencies:** package lock update ✨ ([1a409de](1a409de))
* **dependencies:** update all ✨ ([058e214](058e214))
* **dependencies:** upgrade all and switch tonew Joi ✨ ([ef5a50f](ef5a50f))
* **docker:** init docker & docker compose ✨ ([d28e047](d28e047))
* **docker:** review user to do nothing in root ✨ ([6ec0a82](6ec0a82))
* **error:** generic error handler for API requests ([f8274cb](f8274cb)), closes [#11](#11)
* **error:** generic error handler for API requests ([cd56b58](cd56b58))
* **gloabl:** init knowlegdges file like swift repo 🎉 ([96d2afa](96d2afa))
* **global:** add example api link in default html ✨ ([cc709f3](cc709f3))
* **global:** add fixme plugin for codeclimate 🎉 ([d9432a3](d9432a3))
* **global:** add keywords ✨ ([9d1935d](9d1935d))
* **global:** add mongo dump/restore (easy for dev team) ✨ ([2cffc39](2cffc39))
* **global:** add our own waos-CC to define and check commits ✨ ([a3ea1e1](a3ea1e1))
* **global:** add vue demo ✨ ([84ed54a](84ed54a))
* **global:** comitizen/comitlint & standard version initialization ([714c516](714c516))
* **global:** end update ✨ ([1ca9068](1ca9068))
* **global:** init wiki 📚 ([2181d33](2181d33))
* **global:** upgrade dependencies ⬆️ ([b9c616d](b9c616d))
* **global:** upgrade stack ✨ ([17e6134](17e6134))
* **global:** upgrade stack ✨ ([e8b629c](e8b629c))
* **helpers:** add return to response - allow next res operations ✨ ([06ba553](06ba553))
* **helpers:** add slug function to typing ✨ ([4639b57](4639b57))
* **helpers:** add some comments  💡 ([8f6f728](8f6f728))
* **helpers:** add typing map functions ✨ ([18a7d66](18a7d66))
* **helpers:** custom node error to deserve default api errors 🎉 ([0eab61d](0eab61d))
* **helpers:** init mail alert ✨ ([2fba2c8](2fba2c8))
* **helpers:** init mail alert template ✨ ([8918641](8918641))
* **history:** add get function ✨ ([6f1af80](6f1af80))
* **history:** add username ✨ ([0284a98](0284a98))
* **history:** init mail alert ✨ ([0da3fb4](0da3fb4))
* **history:** split from api :) ✨ ([eda9526](eda9526)), closes [#4](#4)
* **issues:** Update issue templates ([3e158e7](3e158e7))
* **jwt:** adding initial support for jwt authentication ([7b63c78](7b63c78))
* **jwt:** tidying up strategy definition ([3e2644f](3e2644f))
* **lib:** add graceful shutdown, prevention for docker ✨ ([eaa6a8e](eaa6a8e))
* **lib:** expose Joi function from middleware, for dynamic schema ✨ ([e6fac31](e6fac31))
* **middlewares:** add isOwner policy example ✨ ([09916ad](09916ad))
* **pacakge.json:** update engines and npm run scripts ([e7a8b9e](e7a8b9e))
* **readme:** add api informations 📚 ([c8cfc6d](c8cfc6d))
* **scraps:** add random date option ✨ ([5a12320](5a12320))
* **script:** end cron script ✨ ([d44cbaa](d44cbaa))
* **scripts:** add uploads in restore & switch to fs promise (big restore) ✨ ([71eb5d5](71eb5d5))
* **scripts:** adjust cron ✨ ([9d69274](9d69274))
* **scripts:** init cron ✨ ([de1c7a1](de1c7a1))
* **scripts:** init prod base db ✨ ([b8a89ed](b8a89ed))
* **seed:** add tasks in seed ✨ ([1b353b6](1b353b6))
* **seed:** adding seed support for sequelize and compiled both into a gulp task, also took out the ([ae3eaf3](ae3eaf3))
* **seed:** refactoring seeding functionality to be exported by the mongoose helper library and used as a gulp task, rather than the server bootstrap method ([27b4941](27b4941))
* **subscriptions:** init mail subscriptions example ✨ ([34fdd9c](34fdd9c))
* **tags:** reset ✨ ([235c725](235c725))
* **tasks:** add clean populate example ✨ ([dfaf37b](dfaf37b))
* **tasks:** init stats example ✨ ([e809d9a](e809d9a))
* **tasks:** new tasks module to use sequelizejs ([#1693](#1693)) ([3f9a872](3f9a872))
* **tasks,users:** add createAt updateAt ✨ ([d63699e](d63699e))
* **typing:** review hour conversion work ✨ ([03473c8](03473c8))
* **uploads:** add contentLength for direct download progress ✨ ([dea967a](dea967a))
* **uploads:** add purge script example ✨ ([363cd28](363cd28))
* **uploads:** add sharp operation example for images ✨ ([ad6461a](ad6461a))
* **uploads, config:** add sharp default configuration ✨ ([4f8faf1](4f8faf1))
* **user:** add bio ✨ ([fb31df8](fb31df8))
* **user:** add bio ✨ ([aab5668](aab5668))
* **user:** add test on register with same email ✅ ([a5bbec2](a5bbec2))
* **user:** add test on weak password ✅ ([fbd1e7f](fbd1e7f))
* **users:** add remove avatar ✨ ([f132fd9](f132fd9))
* **users:** add stats example ✨ ([e9108b2](e9108b2))
* **users:** add user delete option ✨ ([a0b75df](a0b75df))
* **users:** end policy ✨ ([4811602](4811602))
* **users:** rework tokens ✨ ([88a8191](88a8191))
* **users, tasks:** init data privacy management example ✨ ([58edcab](58edcab))
* **users, uploads, lib:** init uploadx example with gridfs & stream ✨ ([e991ecb](e991ecb))

### Reverts

* Revert ":shirt: fix lint" ([c5aec01](c5aec01))
PierreBrisorgueil added a commit that referenced this pull request May 3, 2026
…xes (#1 #2 #3) (#3588)

* refactor(billing): slim BillingSubscription schema (delegate periodEnd to Stripe API)

Drop currentPeriodEnd and cancelAtPeriodEnd from Mongoose model and Zod schema.
Add stripeEventId field (tiebreaker for same-second event ordering, V5 P1 #2).
Migration 20260503000200 unsets the removed fields from existing documents.

* refactor(billing): fetchSubscriptionDetails helper + getSubscription merge Stripe details

New fetchSubscriptionDetails() fetches currentPeriodEnd, cancelAtPeriodEnd, status,
nextRenewalDate from Stripe API on-demand (+50ms on GET /subscription, 0ms on quota gate).
getSubscription() merges cached local fields with live Stripe details for UI consumers.
Falls back gracefully when Stripe is not configured or subscription is free.

* refactor(billing): unified webhook handlers — drop period fields, pass eventId

handleSubscriptionUpdated: drop currentPeriodEnd/cancelAtPeriodEnd from $set fields.
All 4 handlers now call updateIfEventNewer(id, created, eventId, fields).
handleInvoicePaymentSucceeded: add event param + use updateIfEventNewer (V5 P1 #1).
handleSubscriptionDeleted: force meter rotate to free on cancel (V5 P1 #3).

* fix(billing): event tiebreaker via eventId for same-second deliveries (V5 P1 #2)

updateIfEventNewer now takes eventId as 3rd param. Same-second events are ordered
by lex string comparison of evt_ IDs, preventing the 2nd event from being silently
skipped when both events have the same Unix second timestamp.
Stores stripeEventId alongside stripeEventCreatedAt in the document.

* refactor(billing): drop billing.refund.service — inline Stripe refund in admin controller

billing.refund.service.js had a single function (refundCharge) used only by the admin
controller. Inline it directly to eliminate an unnecessary service indirection layer.
Idempotency key pattern and argument validation are preserved unchanged.

* test(billing): update tests for PR2 — new signatures, V5 P1 coverage, inline refund

- subscription.schema: drop cancelAtPeriodEnd/currentPeriodEnd tests, add stripeEventId
- subscription.repository: updateIfEventNewer now 4-arg; add same-second tiebreaker test
- webhook.integration: add eventId arg to all updateIfEventNewer assertions; V5 P1 #3 tests
- webhook.subscription: updateIfEventNewer 4-arg; handleInvoicePaymentSucceeded with event
- billing.service: updateIfEventNewer 4-arg; add forceRotateForPlanChange mock
- billing.checkout: fetchSubscriptionDetails tests + updated getSubscription (Stripe merge)
- billing.admin.integration: rewritten for inline Stripe (no refund service mock)
- billing.refund.service: rewritten as admin controller refund tests

* fix(billing): payment_succeeded markers + admin refund key + reason guard

- webhook: always advance stripeEventCreatedAt/stripeEventId on
  invoice.payment_succeeded, even when pastDueSince is already null;
  prevents stale out-of-order replays from being applied against a
  markers state that was never advanced on routine invoices
- admin: replace fixed idempotency key with randomUUID suffix so
  multiple partial refunds on the same charge are not collapsed within
  Stripe's 24 h idempotency window
- reason validation already enforced upstream via AdminRefundRequest
  Zod schema (z.enum); no controller change required
PierreBrisorgueil added a commit that referenced this pull request May 7, 2026
…r pagination, log levels (#3623)

* chore(billing): batch 4 — RUNBOOKS accuracy, params validation, cursor pagination, log levels

1. RUNBOOKS.md: #2 dead-letter retry count 3→5 (matches BILLING_WEBHOOK_MAX_ATTEMPTS=5);
   #3 plans/bump body: drop 'reason' field (not in AdminBumpPlanRequest schema, was 422)

2. Zod params validation on admin endpoints: AdminOrgIdParam (ObjectId regex) +
   AdminEventIdParam (evt_* regex) wired via safeParse in adminGetCustomerStatus,
   adminSyncFromStripe, adminCancelSubscription, adminPurgeDeadLetter → 422 on invalid input

3. Cursor-based pagination in reconcile service: replace skip+limit with
   _id > lastSeenId cursor in _fetchPage / findPageForReconciliation.
   Stable across new subscription inserts mid-run. Tests for multi-page + cursor stability.

4. dispute.funds_reinstated log level: logger.warn → logger.error in
   handleChargeDisputeFundsReinstated (action-required state, not warn-noise)

5. creditPack duplicate observability: log result.applied=false at debug level
   in handleCheckoutPaymentCompleted to surface Stripe redelivery phantom calls

6. billing.init.js console.warn → logger.warn (6 occurrences)

* fix(billing): add AdminOrgIdParam validation to adminDisputeCredit path param

Completes the Batch 4 admin endpoint param coverage — adminDisputeCredit
/:orgId was missed in the initial pass. Now all 5 :orgId admin endpoints
validate with AdminOrgIdParam.safeParse → 422 on invalid ObjectId.

* test(billing): strengthen service-wiring assertions in admin param validation tests

CodeRabbit nit: tests asserting "reaches the service" now also verify the
controller passed the validated param to the service method (getCustomerStatus
called with orgId, purgeDeadLetter called with eventId).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant