Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor contacts models to have a single model, remove useless properties and improve updating #16667

Merged
merged 12 commits into from
Nov 28, 2024

Conversation

jrainville
Copy link
Member

@jrainville jrainville commented Oct 30, 2024

What does the PR do

Fixes #16549
Fixes #14964
Fixes #14966

This PR is in three parts. I recommend revieing per commit.

  1. Refactors the 5 types of contact models (all, mutuals, banned, received and sent) into only the allContacts and use an Adaptor on the QML side to filter into the needed models.
    This cleans the Nim side a lot and makes applying updates to the contacts' model way simpler.
  2. Remove useless and duplicated contact properties
    OptionalName and isSyncing were never used.
    DefaultDisplayName was not really used and is actually a duplication of preferredDisplayName, so I replaced the limited usages of DefaultDisplayName by preferredDisplayName
  3. Improve contact updates by not removing and re-adding
    We used to update contact items by removing them from the models and re-adding them. This is highly inefficient.
    Instead, the proper way is to update only the values that changed.

Affected areas

Contacts models, so the contacts settings, but also the profile popups and context menus

Architecture compliance

Screenshot of functionality (including design for comparison)

contacts-updates.webm
  • in the video, the image doesn't update correctly, I fixed it after by changing the use of icon to thumbnailImage. This is something we should refactor, but it seemed too risky for too little payoff. Basically, icon and thumbnailImage are both the same thing.

Impact on end user

No direct impact. The memory usage should be a little lower and the performance a little better when contacts get updated

How to test

  • Test updating contacts, banning them, adding them, sending requests and while doing all those, check the contact lists, the profile, the context menus.

Risk

Tick one:

  • Low risk: 2 devs MUST perform testing as specified above and attach their results as comments to this PR before merging.
  • High risk: QA team MUST perform additional testing in the specified affected areas before merging.

Worst case, some properties don't update until a reboot.

@jrainville jrainville requested review from a team and osmaczko October 30, 2024 19:00
@status-im-auto
Copy link
Member

status-im-auto commented Oct 30, 2024

Jenkins Builds

Click to see older builds (107)
Commit #️⃣ Finished (UTC) Duration Platform Result
✔️ bbd1b72 #1 2024-10-30 19:06:56 ~6 min tests/nim 📄log
bbd1b72 #1 2024-10-30 19:11:37 ~11 min tests/ui 📄log
✔️ bbd1b72 #1 2024-10-30 19:11:42 ~11 min macos/aarch64 🍎dmg
✔️ bbd1b72 #1 2024-10-30 19:16:45 ~16 min linux-nix/x86_64 📦tgz
✔️ bbd1b72 #1 2024-10-30 19:21:00 ~20 min windows/x86_64 💿exe
✔️ bbd1b72 #1 2024-10-30 19:22:45 ~22 min linux/x86_64 📦tgz
✔️ bbd1b72 #1 2024-10-30 19:31:35 ~31 min macos/x86_64 🍎dmg
✔️ ddc2efe #2 2024-10-31 14:29:53 ~6 min macos/aarch64 🍎dmg
✔️ ddc2efe #2 2024-10-31 14:30:35 ~7 min tests/nim 📄log
ddc2efe #2 2024-10-31 14:35:18 ~11 min tests/ui 📄log
✔️ ddc2efe #2 2024-10-31 14:38:12 ~14 min macos/x86_64 🍎dmg
✔️ ddc2efe #2 2024-10-31 14:44:04 ~20 min windows/x86_64 💿exe
✔️ ddc2efe #2 2024-10-31 14:45:28 ~22 min linux/x86_64 📦tgz
✔️ ddc2efe #2 2024-10-31 14:45:54 ~22 min linux-nix/x86_64 📦tgz
✔️ 1945a45 #3 2024-10-31 19:05:31 ~4 min macos/aarch64 🍎dmg
✔️ 1945a45 #3 2024-10-31 19:08:56 ~7 min tests/nim 📄log
1945a45 #3 2024-10-31 19:13:21 ~12 min tests/ui 📄log
✔️ 1945a45 #3 2024-10-31 19:13:59 ~13 min linux-nix/x86_64 📦tgz
✔️ 1945a45 #3 2024-10-31 19:15:20 ~14 min macos/x86_64 🍎dmg
✔️ 1945a45 #3 2024-10-31 19:19:10 ~18 min windows/x86_64 💿exe
✔️ 1945a45 #3 2024-10-31 19:22:19 ~21 min linux/x86_64 📦tgz
✔️ 3ff81f2 #5 2024-11-14 10:31:05 ~6 min macos/aarch64 🍎dmg
✔️ 3ff81f2 #5 2024-11-14 10:31:33 ~7 min tests/nim 📄log
3ff81f2 #5 2024-11-14 10:36:10 ~11 min tests/ui 📄log
✔️ 3ff81f2 #5 2024-11-14 10:43:21 ~19 min macos/x86_64 🍎dmg
✔️ 3ff81f2 #5 2024-11-14 10:44:38 ~20 min linux-nix/x86_64 📦tgz
✔️ 3ff81f2 #5 2024-11-14 10:45:51 ~21 min windows/x86_64 💿exe
✔️ 3ff81f2 #5 2024-11-14 10:46:04 ~21 min linux/x86_64 📦tgz
✔️ a01c69a #6 2024-11-14 11:23:18 ~5 min macos/aarch64 🍎dmg
✔️ a01c69a #6 2024-11-14 11:26:06 ~7 min tests/nim 📄log
✔️ a01c69a #6 2024-11-14 11:31:06 ~12 min tests/ui 📄log
✔️ a01c69a #6 2024-11-14 11:34:23 ~16 min macos/x86_64 🍎dmg
✔️ a01c69a #6 2024-11-14 11:36:54 ~18 min windows/x86_64 💿exe
✔️ a01c69a #6 2024-11-14 11:38:29 ~20 min linux-nix/x86_64 📦tgz
✔️ a01c69a #6 2024-11-14 11:38:36 ~20 min linux/x86_64 📦tgz
✔️ 1498831 #8 2024-11-14 14:20:17 ~5 min macos/aarch64 🍎dmg
✔️ 1498831 #8 2024-11-14 14:22:11 ~7 min tests/nim 📄log
✔️ 1498831 #8 2024-11-14 14:27:05 ~12 min tests/ui 📄log
✔️ 1498831 #8 2024-11-14 14:29:17 ~14 min macos/x86_64 🍎dmg
✔️ 1498831 #8 2024-11-14 14:32:29 ~17 min linux-nix/x86_64 📦tgz
✔️ 1498831 #8 2024-11-14 14:36:39 ~21 min linux/x86_64 📦tgz
✔️ 0ebc1fb #9 2024-11-15 14:37:27 ~4 min macos/aarch64 🍎dmg
✔️ 0ebc1fb #9 2024-11-15 14:40:34 ~7 min tests/nim 📄log
✔️ 0ebc1fb #9 2024-11-15 14:45:41 ~12 min tests/ui 📄log
✔️ 0ebc1fb #9 2024-11-15 14:47:17 ~14 min linux-nix/x86_64 📦tgz
✔️ 0ebc1fb #9 2024-11-15 14:47:35 ~14 min macos/x86_64 🍎dmg
✔️ 0ebc1fb #9 2024-11-15 14:52:19 ~19 min windows/x86_64 💿exe
✔️ 0ebc1fb #9 2024-11-15 14:53:01 ~20 min linux/x86_64 📦tgz
✔️ c0ad3cb #10 2024-11-15 15:19:37 ~4 min macos/aarch64 🍎dmg
✔️ c0ad3cb #10 2024-11-15 15:23:12 ~7 min tests/nim 📄log
✔️ c0ad3cb #10 2024-11-15 15:27:56 ~12 min linux-nix/x86_64 📦tgz
✔️ c0ad3cb #10 2024-11-15 15:28:04 ~12 min tests/ui 📄log
✔️ c0ad3cb #10 2024-11-15 15:29:13 ~13 min macos/x86_64 🍎dmg
✔️ c0ad3cb #10 2024-11-15 15:34:01 ~18 min windows/x86_64 💿exe
✔️ c0ad3cb #10 2024-11-15 15:35:53 ~20 min linux/x86_64 📦tgz
✔️ b1048da #11 2024-11-15 15:55:21 ~4 min macos/aarch64 🍎dmg
✔️ b1048da #11 2024-11-15 15:59:10 ~8 min tests/nim 📄log
b1048da #11 2024-11-15 16:03:44 ~12 min tests/ui 📄log
✔️ b1048da #11 2024-11-15 16:03:48 ~12 min linux-nix/x86_64 📦tgz
✔️ b1048da #11 2024-11-15 16:04:52 ~13 min macos/x86_64 🍎dmg
✔️ b1048da #11 2024-11-15 16:09:54 ~18 min windows/x86_64 💿exe
✔️ b1048da #11 2024-11-15 16:11:12 ~20 min linux/x86_64 📦tgz
b1048da #12 2024-11-15 23:04:08 ~12 min tests/ui 📄log
✔️ ebc4009 #12 2024-11-16 00:01:53 ~4 min macos/aarch64 🍎dmg
✔️ ebc4009 #12 2024-11-16 00:05:00 ~7 min tests/nim 📄log
✔️ ebc4009 #13 2024-11-16 00:10:02 ~12 min tests/ui 📄log
✔️ ebc4009 #12 2024-11-16 00:10:10 ~13 min linux-nix/x86_64 📦tgz
✔️ ebc4009 #12 2024-11-16 00:10:59 ~13 min macos/x86_64 🍎dmg
✔️ ebc4009 #12 2024-11-16 00:16:51 ~19 min windows/x86_64 💿exe
✔️ ebc4009 #12 2024-11-16 00:17:24 ~20 min linux/x86_64 📦tgz
✔️ 7cf5db4 #13 2024-11-18 10:03:27 ~4 min macos/aarch64 🍎dmg
✔️ 7cf5db4 #13 2024-11-18 10:06:35 ~7 min tests/nim 📄log
✔️ 7cf5db4 #14 2024-11-18 10:11:23 ~12 min tests/ui 📄log
✔️ 7cf5db4 #13 2024-11-18 10:13:41 ~14 min linux-nix/x86_64 📦tgz
✔️ 7cf5db4 #13 2024-11-18 10:14:21 ~15 min macos/x86_64 🍎dmg
✔️ 7cf5db4 #13 2024-11-18 10:18:57 ~20 min linux/x86_64 📦tgz
✔️ 7cf5db4 #13 2024-11-18 10:24:07 ~25 min windows/x86_64 💿exe
✔️ 0191153 #14 2024-11-18 15:03:57 ~4 min macos/aarch64 🍎dmg
✔️ 0191153 #14 2024-11-18 15:07:11 ~7 min tests/nim 📄log
✔️ 0191153 #15 2024-11-18 15:12:40 ~13 min tests/ui 📄log
✔️ 0191153 #14 2024-11-18 15:18:01 ~18 min linux-nix/x86_64 📦tgz
✔️ 0191153 #14 2024-11-18 15:18:28 ~19 min linux/x86_64 📦tgz
✔️ 0191153 #14 2024-11-18 15:19:21 ~19 min windows/x86_64 💿exe
✔️ 0191153 #14 2024-11-18 15:21:16 ~21 min macos/x86_64 🍎dmg
✔️ 58b9d72 #15 2024-11-19 14:29:56 ~4 min macos/aarch64 🍎dmg
✔️ 58b9d72 #15 2024-11-19 14:33:19 ~7 min tests/nim 📄log
✔️ 58b9d72 #16 2024-11-19 14:38:03 ~12 min tests/ui 📄log
✔️ 58b9d72 #15 2024-11-19 14:39:24 ~14 min linux-nix/x86_64 📦tgz
✔️ 58b9d72 #15 2024-11-19 14:39:54 ~14 min macos/x86_64 🍎dmg
✔️ 58b9d72 #15 2024-11-19 14:45:38 ~20 min windows/x86_64 💿exe
✔️ 58b9d72 #15 2024-11-19 14:45:58 ~20 min linux/x86_64 📦tgz
✔️ 75b2364 #16 2024-11-19 16:17:19 ~4 min macos/aarch64 🍎dmg
✔️ 75b2364 #16 2024-11-19 16:20:33 ~7 min tests/nim 📄log
✔️ 75b2364 #17 2024-11-19 16:25:24 ~12 min tests/ui 📄log
✔️ 75b2364 #16 2024-11-19 16:25:44 ~13 min linux-nix/x86_64 📦tgz
✔️ 75b2364 #16 2024-11-19 16:27:15 ~14 min macos/x86_64 🍎dmg
✔️ 75b2364 #16 2024-11-19 16:31:49 ~19 min windows/x86_64 💿exe
✔️ 75b2364 #16 2024-11-19 16:33:04 ~20 min linux/x86_64 📦tgz
✔️ 4eeb681 #17 2024-11-22 14:02:37 ~5 min macos/aarch64 🍎dmg
✔️ 4eeb681 #17 2024-11-22 14:05:39 ~8 min tests/nim 📄log
29ec688 #18 2024-11-22 14:09:54 ~3 min macos/aarch64 📄log
✔️ 29ec688 #18 2024-11-22 14:14:41 ~7 min tests/nim 📄log
29ec688 #18 2024-11-22 14:17:16 ~10 min linux-nix/x86_64 📄log
29ec688 #18 2024-11-22 14:17:45 ~11 min linux/x86_64 📄log
✔️ 29ec688 #19 2024-11-22 14:19:51 ~13 min tests/ui 📄log
29ec688 #18 2024-11-22 14:21:16 ~14 min macos/x86_64 📄log
29ec688 #18 2024-11-22 14:22:07 ~15 min windows/x86_64 📄log
Commit #️⃣ Finished (UTC) Duration Platform Result
✔️ e83a43d #19 2024-11-22 14:51:50 ~4 min macos/aarch64 🍎dmg
✔️ e83a43d #19 2024-11-22 14:55:24 ~8 min tests/nim 📄log
✔️ e83a43d #20 2024-11-22 15:00:10 ~12 min tests/ui 📄log
✔️ e83a43d #19 2024-11-22 15:00:48 ~13 min linux-nix/x86_64 📦tgz
✔️ e83a43d #19 2024-11-22 15:02:08 ~14 min macos/x86_64 🍎dmg
✔️ e83a43d #19 2024-11-22 15:05:08 ~17 min windows/x86_64 💿exe
✔️ e83a43d #19 2024-11-22 15:09:06 ~21 min linux/x86_64 📦tgz
✔️ dc53713 #20 2024-11-22 16:05:34 ~4 min macos/aarch64 🍎dmg
✔️ dc53713 #20 2024-11-22 16:08:53 ~8 min tests/nim 📄log
✔️ dc53713 #21 2024-11-22 16:13:31 ~12 min tests/ui 📄log
✔️ dc53713 #20 2024-11-22 16:13:48 ~13 min linux-nix/x86_64 📦tgz
✔️ dc53713 #20 2024-11-22 16:14:08 ~13 min macos/x86_64 🍎dmg
✔️ dc53713 #20 2024-11-22 16:18:58 ~18 min windows/x86_64 💿exe
✔️ dc53713 #20 2024-11-22 16:21:21 ~20 min linux/x86_64 📦tgz

Copy link
Member

@micieslak micieslak left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's really nice to see all those simplifications (and alignments to the architecture) there. It's good move for sure. But I'm afraid that there some additional work to do because other places that are in a questionable state and depend on the changes introduced there.

For example in TransactionAddress.qml we have connections listening to onItemChanged on myContactsModel, receivedContactRequestsModel, sentContactRequestsModel. It won't work as intended anymore. In general calling getContactDetailsAsJson in that delegate is far from ideal solution and should be fixed. We need to think how to provide all the necessary data via the model instead of accessing them from the backend on a delegate level. It may trigger necessity of refactor of the whole TransactionDetailView unfortunately.

Something similar I see in Chat/stores/RootStore and ActivityNotificationMessage. It all leads to hated getContactDetailsAsJson which I'd live to see removed finally.

I can try to provide some support with those further refactors here if needed. I'm not sure now how big it actually is...

ui/app/AppLayouts/Profile/stores/ContactsModelAdaptor.qml Outdated Show resolved Hide resolved
ui/app/AppLayouts/Profile/stores/ContactsStore.qml Outdated Show resolved Hide resolved
@jrainville
Copy link
Member Author

@micieslak damn I hadn't thought of the use of onItemChanged. I did see it in the model and found it strange, but used everywhere, so I didn't touch it, but you're right, my changes will break the places that rely on it. I just tested the ActiviterCenterMessage and indeed it didn't update.

I'll try to see if there is a way to rely on the model instead. Your help and @alexjba 's would be appreciated, because we basically have to get rid of getContactDetailsAsJson

@alexjba
Copy link
Contributor

alexjba commented Nov 14, 2024

@micieslak damn I hadn't thought of the use of onItemChanged. I did see it in the model and found it strange, but used everywhere, so I didn't touch it, but you're right, my changes will break the places that rely on it. I just tested the ActiviterCenterMessage and indeed it didn't update.

I'll try to see if there is a way to rely on the model instead. Your help and @alexjba 's would be appreciated, because we basically have to get rid of getContactDetailsAsJson

Sorry for the delayed response!
Indeed we need to remove the onItemChanged usage. Instead of a combo of onItemChanged and getContactDetailsAsJson we can use a ContactDetails object. This object is live and all properties as well. Currently it needs the ContactsStore, ProfileStore and pubKey. We have a working example in ProfileDialogView.

@alexjba
Copy link
Contributor

alexjba commented Nov 14, 2024

@jrainville Please let me know if I can help with the migration to ContactDetails.

Please have a look on this Epic #11983.
Basically this Pr is closing:
#14964
#14966

@micieslak micieslak changed the base branch from master to feat/issue-16754 November 14, 2024 10:23
Base automatically changed from feat/issue-16754 to master November 14, 2024 14:13
@micieslak micieslak force-pushed the refactor/users-models branch 2 times, most recently from 1498831 to 0ebc1fb Compare November 15, 2024 14:32
@micieslak micieslak self-requested a review November 15, 2024 14:34
@micieslak micieslak force-pushed the refactor/users-models branch 3 times, most recently from b1048da to ebc4009 Compare November 15, 2024 23:56
Copy link
Member

@caybro caybro left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Massive work, LGTM except some smaller details

readonly property int lastUpdated: d.contactDetails.lastUpdated ?? 0
readonly property int lastUpdatedLocally: d.contactDetails.lastUpdatedLocally ?? 0
readonly property string thumbnailImage: d.contactDetails.thumbnailImage ?? ""
readonly property string largeImage: d.contactDetails.largeImage ?? ""
readonly property bool isContactRequestReceived: d.contactDetails.isContactRequestReceived ?? false
readonly property bool isContactRequestSent: d.contactDetails.isContactRequestSent ?? false
readonly property bool isSyncing: d.contactDetails.isSyncing ?? false
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No longer needed?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed. We don't use that property anywhere

ui/app/AppLayouts/Profile/views/ContactsView.qml Outdated Show resolved Hide resolved
@anastasiyaig
Copy link
Contributor

hey @micieslak , test is failing because no contact request on Pending tab

image

DBG 2024-11-18 12:01:44.787Z Add AC notification                        topics="notifications-manager" tid=2800881 file=notifications_manager.nim:229 notificationType=NewContactRequest
DBG 2024-11-18 12:01:44.787Z Add APP notification                       topics="notifications-manager" tid=2800881 file=notifications_manager.nim:255 notificationType=NewContactRequest
WRN 2024-11-18 12:01:46.771Z qt warning                                 topics="qt" tid=2800881 text="Warning: \"Failed to connect: Connection refused\"" file=:0 category=default

@jrainville
Copy link
Member Author

@micieslak I fixed the issue. I took the easy way of just checking the model when we get an update whether the item is already there and if not, adding it.

I tried modifying the service, but what ended up happening is that we called added then updated in a row, which felt wasteful.

I think it's fine to react to updated to add the contact anyway, because that's how status-go functions as well.

@anastasiyaig
Copy link
Contributor

thanks for jumping in @jrainville , lets see if tests pass now :)

@anastasiyaig
Copy link
Contributor

@jrainville

17:17:43  /home/jenkins/workspace/rs_linux_x86_64_package_PR-16667/src/app/modules/main/profile_section/contacts/controller.nim(38, 18) Error: attempting to call undeclared routine: 'addOrUpdateContactItem'
17:17:43  make: *** [Makefile:562: bin/nim_status_client] Error 1

@jrainville
Copy link
Member Author

Sorry about that, I kinda renamed a lot of function without testing lol.

I fixed it, cleaned up some more and tested for real

@anastasiyaig
Copy link
Contributor

tests are still failing on missing contact requests showing up. now its even not present in activity centre

@anastasiyaig
Copy link
Contributor

@jrainville so when i send contact request, the application crashes on receiver side

@jrainville
Copy link
Member Author

@jrainville so when i send contact request, the application crashes on receiver side

Yeah sorry about that. I'm fixing that. I guess I'm still tired 😞

@jrainville
Copy link
Member Author

Done, it should be good now. (please please please let it be good 🙏 )

@anastasiyaig
Copy link
Contributor

Done, it should be good now. (please please please let it be good 🙏 )

thank you! Lets see :)

@anastasiyaig
Copy link
Contributor

@jrainville thanks for fixes, the contact requests are now feeling alright. However current run will fail because of the random app crash, we will have to restart :/

Copy link
Member Author

@jrainville jrainville left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reviewed all the code that includes @micieslak 's changes and LGTM. I can't approve my own PR though haha

readonly property int lastUpdated: d.contactDetails.lastUpdated ?? 0
readonly property int lastUpdatedLocally: d.contactDetails.lastUpdatedLocally ?? 0
readonly property string thumbnailImage: d.contactDetails.thumbnailImage ?? ""
readonly property string largeImage: d.contactDetails.largeImage ?? ""
readonly property bool isContactRequestReceived: d.contactDetails.isContactRequestReceived ?? false
readonly property bool isContactRequestSent: d.contactDetails.isContactRequestSent ?? false
readonly property bool isSyncing: d.contactDetails.isSyncing ?? false
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed. We don't use that property anywhere

@jrainville
Copy link
Member Author

I switched this PR to High Risk since it touches so many places in the end.

@glitchminer can you take a look at this PR and run some tests with regards to contacts, contact requests, banned members. Moving contacts from one state to the other, updating their properties, etc.

cc @anastasiyaig

Copy link
Member

@caybro caybro left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Reviewed earlier already, just forgot to send the verdict 🤦

@anastasiyaig
Copy link
Contributor

I switched this PR to High Risk since it touches so many places in the end.

@glitchminer can you take a look at this PR and run some tests with regards to contacts, contact requests, banned members. Moving contacts from one state to the other, updating their properties, etc.

cc @anastasiyaig

i will launch autotests to check that, but banning users should be tested manually @glitchminer ,out autotest is blocked by the floating buttons on hover (cant click them )

@anastasiyaig
Copy link
Contributor

I switched this PR to High Risk since it touches so many places in the end.
@glitchminer can you take a look at this PR and run some tests with regards to contacts, contact requests, banned members. Moving contacts from one state to the other, updating their properties, etc.
cc @anastasiyaig

i will launch autotests to check that, but banning users should be tested manually @glitchminer ,out autotest is blocked by the floating buttons on hover (cant click them )

thats done, only 1 test to send nft failed which i dont know yet how to fix properly
https://ci.status.im/job/status-desktop/job/e2e/job/manual/2588/allure/#suites/70fdb27d8baec44f061998da79f5a084/595b6319d491d2af/

cc @glitchminer

@glitchminer
Copy link
Contributor

In progress, will complete this tomorrow. @jrainville , are notifications for contact actions in scope for this, like when removing or blocking contact?

@jrainville
Copy link
Member Author

In progress, will complete this tomorrow. @jrainville , are notifications for contact actions in scope for this, like when removing or blocking contact?

(repeating for posterity) everything should work as it did before, so if they worked on master, then they should still work

@glitchminer glitchminer self-requested a review November 27, 2024 22:59
@jrainville jrainville merged commit 50132c5 into master Nov 28, 2024
9 checks passed
@jrainville jrainville deleted the refactor/users-models branch November 28, 2024 14:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
7 participants