Skip to content

feat(user): let members change their own details and additional membership improvements - #146

Open
tomudding wants to merge 8 commits into
GEWIS:mainfrom
tomudding:feat/member-self-service
Open

feat(user): let members change their own details and additional membership improvements#146
tomudding wants to merge 8 commits into
GEWIS:mainfrom
tomudding:feat/member-self-service

Conversation

@tomudding

Copy link
Copy Markdown
Member

Description

Members can now change what the register holds about them: their email address,
their three addresses and the mailing lists that are theirs to manage, on a My
details page beside the other settings and behind sudo like them. What only the
secretary may change is shown there read-only, so everything on file is in one
place. Changing an email address takes effect only once a link sent to the new
address is followed while signed in, and the address that was replaced is told
that it happened; the subscriptions held under the old address are carried over
on the flush that writes it, wherever it was written from.

Whoever's membership is about to run out and who is not installed in a body is
now written to 45 days ahead and asked whether they want to stay on as a
graduate, because a student registered with a TU/e address stops being reachable
once they leave. They can accept, decline, or decline and ask the secretary to
remove their data. The secretary's bulk conversion stays for the people the
sweep cannot reach, and the two now settle one ending exactly once.

Both member pages also list the memberships somebody has held, and a weekly
check reports memberships that overlap or run backwards.

Along the way: action links (renewal, payment, and the two new kinds) carry a
split token of which only a hash is stored and are handed in for a single-use
claim, the way the password reset already worked; the dormant "pending member
updates" flow is dropped; and the messages the translation extractor could not
see, which --clean had been deleting on every run, are written where it reads
them and translated.

Worth knowing when this deploys: every renewal and payment link currently in
somebody's mailbox stops working, four migrations run, the self-service flag is
off for every mailing list until the secretary turns it on, and two commands
join the schedule (check:membership:conversion:graduate every half hour,
check:membership:consistency weekly).

Screenshots of the three new pages still to be added.

Related issues/external references

Fixes GH-118
Fixes GH-46
Fixes GH-66

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation improvement (no changes to code)
  • Other (please specify)

I like security, so now everything uses the same scheme as the password resets
already use.

Before, a renewal or payment link was a token that was stored as it was mailed
and stayed in the address of the page it opened. A click from a mailbox is a
navigation from another origin, so that token ended up in the referrer of
everything the page loaded, stayed in the browser history, and arrived without
the session cookie the form behind it needs.

Action links now carry a split token, of which the register keeps the selector
and a hash of the verifier. Following one exchanges it for a hash that is good
for one use and three minutes (though we might want to increase that for this
form), and the page that renews or restarts a checkout answers behind that, with
the link held in the session.

Because only the hash is kept, a link cannot be provided again. If this is
required a new link must be generated.
This functionality was never implemented. Now that both applications are one it
is also no longer necessary to keep around.
…s them

All user-facing translatable messages must use `t()`,
`new TranslatableMessage()`, or `trans()`. Without it, the translator does not
pick it up properly, and you are at the mercy of your favourite AI agent to fix
it for you.
For sake of transparency, show how the memberhsip of someone changed each year.
@tomudding
tomudding requested a review from rinkp August 30, 2026 15:20
@tomudding

Copy link
Copy Markdown
Member Author

For transparency, Qwen3.8-27B reviewed (and edited) this code.

@tomudding

Copy link
Copy Markdown
Member Author

@rinkp your review is required here because it touches GH-46 and the bulk graduate conversion. I want to know whether you agree with my approach.

tomudding added a commit that referenced this pull request Aug 31, 2026
…s them (#152)

All user-facing translatable messages must use `t()`,
`new TranslatableMessage()`, or `trans()`. Without it, the translator does not
pick it up properly, and you are at the mercy of your favourite AI agent to fix
it for you.

Cherry-picked from GH-146.
tomudding added a commit that referenced this pull request Sep 4, 2026
Study never needed in GEWISWEB, so it was not included in ReportDB at the time.
The board would like to have this information available, and to allow this to
potentially become part of GH-146, I have now added the propagation logic.

Existing rows are set to Unknown by the migration. They will be updated when
the records are regenerated.
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.

Self-service for member details Introduce checker for maintaining Membership conditions Becoming a graduate should also happen through actionlink

1 participant