api: export mention event ticket references

Currently the JSON export does not set the `from_ticket` field for
events of type TICKET_MENTIONED. This commit implements writing out the
data as described in the legacy API docs:

https://man.sr.ht/todo.sr.ht/api.md#event-resource

Note that currently these events are not imported anyways (never have
been).
This commit is contained in:
Conrad Hoffmann 2023-11-21 22:45:53 +01:00 committed by Drew DeVault
parent 7e6b9628a4
commit 8ad96d48ce
2 changed files with 59 additions and 2 deletions

View File

@ -330,7 +330,34 @@ func exportTicketEvents(ctx context.Context, tx *sql.Tx, ticketID int) ([]Event,
}
evDump.ByUser = exportParticipant(byUser)
}
// TODO: populate FromTicket
if ev.EventType&model.EVENT_TICKET_MENTIONED != 0 {
var (
fromTicket *model.Ticket
fromTicketTracker *model.Tracker
fromTicketTrackerOwner *model.User
err error
)
// TODO write a custom loader, maybe?
fromTicket, err = loaders.ForContext(ctx).TicketsByID.Load(*ev.FromTicketID)
if err != nil {
return nil, err
}
if fromTicket != nil {
fromTicketTracker, err = loaders.ForContext(ctx).TrackersByID.Load(fromTicket.TrackerID)
if err != nil {
return nil, err
}
}
if fromTicketTracker != nil {
fromTicketTrackerOwner, err = loaders.ForContext(ctx).UsersByID.Load(fromTicketTracker.OwnerID)
if err != nil {
return nil, err
}
}
if fromTicketTrackerOwner != nil {
evDump.FromTicket = exportTicketRef(fromTicket, fromTicketTracker, fromTicketTrackerOwner)
}
}
l = append(l, evDump)
}
@ -424,6 +451,23 @@ func exportParticipant(e model.Entity) *Participant {
panic(fmt.Errorf("unknown entity type %T", e))
}
func exportTicketRef(ticket *model.Ticket, tracker *model.Tracker, owner *model.User) *TicketRef {
return &TicketRef{
ID: ticket.ID,
Ref: ticket.Ref(),
Tracker: TrackerRef{
Owner: User{
ID: owner.ID,
CanonicalName: owner.CanonicalName(),
Name: owner.Username,
},
Created: tracker.Created,
Updated: tracker.Updated,
Name: tracker.Name,
},
}
}
func convertNullString(ns *string) string {
if ns == nil {
return ""

View File

@ -54,6 +54,19 @@ type Ticket struct {
Events []Event `json:"events,omitempty"`
}
type TrackerRef struct {
Owner User `json:"owner"`
Created time.Time `json:"created"`
Updated time.Time `json:"updated"`
Name string `json:"name"`
}
type TicketRef struct {
ID int `json:"id"`
Ref string `json:"ref"`
Tracker TrackerRef `json:"tracker"`
}
type Event struct {
ID int `json:"id"`
Created time.Time `json:"created"`
@ -66,7 +79,7 @@ type Event struct {
Comment *Comment `json:"comment,omitempty"`
Label *string `json:"label,omitempty"`
ByUser *Participant `json:"by_user,omitempty"`
FromTicket *Ticket `json:"from_ticket,omitempty"`
FromTicket *TicketRef `json:"from_ticket,omitempty"`
Upstream string `json:"upstream"`
Signature string `json:"X-Payload-Signature,omitempty"`
Nonce string `json:"X-Payload-Nonce,omitempty"`