gotosocial/internal/gtsmodel
kim 311d9a1697 [chore] migration to update statuses.thread_id to be notnull (#4160)
# Description

This is quite a complex database migration that updates the `statuses.thread_id` column to be notnull, in order that statuses always be threaded, which will be useful in various pieces of upcoming work. This is unfortunately a migration that acts over the entire statuses table, and is quite complex in order to ensure that all existing statuses get correctly threaded together, and where possible fix any issues of statuses in the same thread having incorrect thread_ids.

TODO:
- ~~update testrig models to all be threaded~~
- ~~update code to ensure thread_id is always set~~
- ~~run on **a copy** of an sqlite production database~~
- ~~run on **a copy** of a postgres production database~~

## Checklist

- [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md).
- [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat.
- [x] I/we have not leveraged AI to create the proposed changes.
- [x] I/we have performed a self-review of added code.
- [x] I/we have written code that is legible and maintainable by others.
- [x] I/we have commented the added code, particularly in hard-to-understand areas.
- [ ] I/we have made any necessary changes to documentation.
- [x] I/we have added tests that cover new code.
- [x] I/we have run tests and they pass locally with the changes.
- [x] I/we have run `go fmt ./...` and `golangci-lint run`.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4160
Co-authored-by: kim <grufwub@gmail.com>
Co-committed-by: kim <grufwub@gmail.com>
2025-05-26 15:33:42 +02:00
..
account.go [feature] Move to code.superseriousbusiness.org 2025-04-26 15:38:43 +02:00
accountnote.go [chore] Remove go-playground/validator (#2069) 2023-08-06 12:22:40 +02:00
accountsettings.go [feature] Allow user to choose "gallery" style layout for web view of profile (#3917) 2025-03-26 15:59:39 +00:00
accountstats.go [feature/performance] Store account stats in separate table (#2831) 2024-04-16 13:10:13 +02:00
adminaction.go [chore] rename New___(string) int signature functions to Parse___(string) int (#3580) 2024-11-28 12:54:22 +01:00
advancedmigration.go [feature] Conversations API (#3013) 2024-07-23 20:44:31 +01:00
application.go [feature] Refactor tokens, allow multiple app redirect_uris (#3849) 2025-03-03 15:03:36 +00:00
block.go [chore] Remove go-playground/validator (#2069) 2023-08-06 12:22:40 +02:00
common.go [performance] convert enum strings to ints (#3558) 2024-11-25 14:48:59 +01:00
conversation.go [feature] Move to code.superseriousbusiness.org 2025-04-26 15:38:43 +02:00
domainallow.go [feature] Allow editing domain blocks/allows, fix comment import (#3967) 2025-04-04 18:29:22 +02:00
domainblock.go [feature] Allow editing domain blocks/allows, fix comment import (#3967) 2025-04-04 18:29:22 +02:00
domainpermission.go [bugfix] Fix existing perm adoption (#3651) 2025-01-18 18:55:27 +01:00
domainpermissiondraft.go [bugfix] Fix existing perm adoption (#3651) 2025-01-18 18:55:27 +01:00
domainpermissionexclude.go [feature] Move to code.superseriousbusiness.org 2025-04-26 15:38:43 +02:00
domainpermissionsubscription.go [bugfix] Store LastModified for domain perm subs + send as If-Modified-Since (#3655) 2025-01-20 10:56:00 +01:00
emaildomainblock.go [chore] Remove go-playground/validator (#2069) 2023-08-06 12:22:40 +02:00
emoji.go [bugfix] Missing emoji urls (#3707) 2025-01-30 13:52:03 +01:00
emojicategory.go [chore] Remove go-playground/validator (#2069) 2023-08-06 12:22:40 +02:00
filter.go [feature] Move to code.superseriousbusiness.org 2025-04-26 15:38:43 +02:00
follow.go [chore] Remove go-playground/validator (#2069) 2023-08-06 12:22:40 +02:00
followrequest.go [chore] Remove go-playground/validator (#2069) 2023-08-06 12:22:40 +02:00
headerfilter.go [bugfix] Replace named unique constraint on header filter header with generic unique directive (#2525) 2024-01-15 15:39:10 +00:00
instance.go [feature] Add global instance CSS customization setting (#3352) 2024-12-02 12:24:48 +01:00
interaction.go [feature] Notify accounts when a status they've interacted with has been edited (#4157) 2025-05-11 13:38:13 +00:00
interactionpolicy.go [chore] Deprecate with_approval, always (client API), approvalRequired, always (fedi API) (#4173) 2025-05-13 14:48:11 +00:00
list.go [performance] cache more database calls, reduce required database calls overall (#3290) 2024-09-16 16:46:09 +00:00
marker.go [chore] Remove go-playground/validator (#2069) 2023-08-06 12:22:40 +02:00
mediaattachment.go [feature] add support for receiving federated status edits (#3597) 2024-12-05 13:35:07 +00:00
mention.go [bugfix] Fix no notification if mention edited into status (#4102) 2025-05-04 09:45:10 +00:00
move.go [feature/chore] Add Move database functions + cache (#2647) 2024-03-06 11:18:57 +01:00
notification.go [feature] Notify accounts when a status they've interacted with has been edited (#4157) 2025-05-11 13:38:13 +00:00
poll.go [bugfix] update fedi api to support multiple separate votes in same multiple choice poll (#3809) 2025-02-20 11:13:07 +01:00
README.md Prune unnecessary nullzeros, fixup db tags (#200) 2021-09-10 10:08:21 +02:00
report.go [feature] Instance rules (#2125) 2023-08-19 14:33:15 +02:00
routersession.go [chore] Remove go-playground/validator (#2069) 2023-08-06 12:22:40 +02:00
rule.go [feature] Instance rules (#2125) 2023-08-19 14:33:15 +02:00
sinbinstatus.go [feature] Process Reject of interaction via fedi API, put rejected statuses in the "sin bin" 😈 (#3271) 2024-09-10 12:34:49 +00:00
status.go [chore] migration to update statuses.thread_id to be notnull (#4160) 2025-05-26 15:33:42 +02:00
statusbookmark.go [chore] Remove go-playground/validator (#2069) 2023-08-06 12:22:40 +02:00
statusedit.go [bugfix] Store and expose status content type (#3870) 2025-03-06 16:31:52 +00:00
statusfave.go [feature] Notify accounts when a status they've interacted with has been edited (#4157) 2025-05-11 13:38:13 +00:00
statusmute.go [feature] Status thread mute/unmute functionality (#2278) 2023-10-25 15:04:53 +01:00
tag.go [feature] Implement following hashtags (#3141) 2024-07-29 19:26:31 +01:00
thread.go [chore] migration to update statuses.thread_id to be notnull (#4160) 2025-05-26 15:33:42 +02:00
threadmute.go [feature] Status thread mute/unmute functionality (#2278) 2023-10-25 15:04:53 +01:00
token.go [feature] Application creation + management via API + settings panel (#3906) 2025-03-17 14:06:17 +00:00
tombstone.go [chore] Remove go-playground/validator (#2069) 2023-08-06 12:22:40 +02:00
user.go [feature] add TOTP two-factor authentication (2FA) (#3960) 2025-04-07 16:14:41 +02:00
usermute.go [feature] User muting (#2960) 2024-06-06 16:38:02 +00:00
vapidkeypair.go [feature] Push notifications (#3587) 2025-01-23 16:47:30 -08:00
webpushsubscription.go [feature] Implement Web Push notification policy (#3721) 2025-02-03 10:25:53 +00:00
workertask.go [feature] persist worker queues to db (#3042) 2024-07-30 13:58:31 +02:00

A note on when we should set data structures linked to objects in the database to use the bun nullzero tag -- this should only be done if the member type is a pointer, or if the this primitive type is literally invalid with an empty value (e.g. media IDs which when empty signifies a null database value, compared to say an account note which when empty could mean either an empty note OR null database value).

Obviously it is a little more complex than this in practice, but keep it in mind!