156 lines
4.3 KiB
TypeScript
156 lines
4.3 KiB
TypeScript
/**
|
|
* Notifications tell a user when someone follows them or their playlists,
|
|
* upvotes, comments, likes or mentions them, or posts where they follow. This
|
|
* module types the ones `api/services/notification-service.ts` makes, and the
|
|
* data each kind carries. The client's `/notifications` page lists them and
|
|
* turns each into a sentence and a link.
|
|
*
|
|
* @module
|
|
*/
|
|
|
|
/**
|
|
* Says which of the `…Data` interfaces a notification's `data` is. Each value
|
|
* has one `notify…` trigger in `notification-service.ts`.
|
|
*/
|
|
export type NotificationType =
|
|
| "playlist_followed"
|
|
| "user_followed"
|
|
| "user_dump_posted"
|
|
| "playlist_dump_added"
|
|
| "dump_upvoted"
|
|
| "user_mentioned"
|
|
| "dump_commented"
|
|
| "comment_liked";
|
|
|
|
/**
|
|
* Where a notification's dump is now, for its link (`dumpPath`). The server
|
|
* joins it each time it sends the notification, so a renamed dump or poster
|
|
* still links right; it is absent once the dump is deleted.
|
|
*/
|
|
export interface DumpRef {
|
|
dumpSlug?: string;
|
|
dumpOwnerUsername?: string;
|
|
}
|
|
|
|
/** Where a notification's playlist is now, joined as {@link DumpRef} is. */
|
|
export interface PlaylistRef {
|
|
playlistSlug?: string;
|
|
playlistOwnerUsername?: string;
|
|
}
|
|
|
|
/**
|
|
* Carried by a `playlist_followed` notification, sent to a playlist's owner.
|
|
*/
|
|
export interface PlaylistFollowedData extends PlaylistRef {
|
|
followerId: string;
|
|
followerUsername: string;
|
|
playlistId: string;
|
|
playlistTitle: string;
|
|
}
|
|
|
|
/** Carried by a `user_followed` notification, sent to the user followed. */
|
|
export interface UserFollowedData {
|
|
followerId: string;
|
|
followerUsername: string;
|
|
}
|
|
|
|
/**
|
|
* Carried by a `user_dump_posted` notification, sent to the followers of a
|
|
* user who posted a public dump.
|
|
*/
|
|
export interface UserDumpPostedData extends DumpRef {
|
|
dumperId: string;
|
|
dumperUsername: string;
|
|
dumpId: string;
|
|
dumpTitle: string;
|
|
}
|
|
|
|
/**
|
|
* Carried by a `playlist_dump_added` notification, sent to the followers of a
|
|
* public playlist when a public dump is added to it.
|
|
*/
|
|
export interface PlaylistDumpAddedData extends DumpRef, PlaylistRef {
|
|
dumpId: string;
|
|
dumpTitle: string;
|
|
playlistId: string;
|
|
playlistTitle: string;
|
|
}
|
|
|
|
/** Carried by a `dump_upvoted` notification, sent to the dump's poster. */
|
|
export interface DumpUpvotedData extends DumpRef {
|
|
voterId: string;
|
|
voterUsername: string;
|
|
dumpId: string;
|
|
dumpTitle: string;
|
|
}
|
|
|
|
/**
|
|
* Carried by a `user_mentioned` notification, sent to a user @mentioned in a
|
|
* comment, a dump, a playlist's description or a chat message. Its
|
|
* {@link DumpRef} is the dump's, or the comment's dump's; its
|
|
* {@link PlaylistRef} the playlist's.
|
|
*/
|
|
export interface UserMentionedData extends DumpRef, PlaylistRef {
|
|
mentionerId: string;
|
|
mentionerUsername: string;
|
|
contextType: "comment" | "dump" | "playlist" | "chat";
|
|
/** The id of the comment, dump, playlist or chat message. */
|
|
contextId: string;
|
|
/**
|
|
* The title of the dump or playlist, or of the dump a comment is under;
|
|
* empty for the chat.
|
|
*/
|
|
contextTitle: string;
|
|
/**
|
|
* Set only for a comment. It names the dump the comment is under, which the
|
|
* notification's link opens.
|
|
*/
|
|
dumpId?: string;
|
|
}
|
|
|
|
/** Carried by a `dump_commented` notification, sent to the dump's poster. */
|
|
export interface DumpCommentedData extends DumpRef {
|
|
commenterId: string;
|
|
commenterUsername: string;
|
|
commentId: string;
|
|
dumpId: string;
|
|
dumpTitle: string;
|
|
}
|
|
|
|
/** Carried by a `comment_liked` notification, sent to the comment's author. */
|
|
export interface CommentLikedData extends DumpRef {
|
|
likerId: string;
|
|
likerUsername: string;
|
|
commentId: string;
|
|
dumpId: string;
|
|
dumpTitle: string;
|
|
}
|
|
|
|
/**
|
|
* Stored when the notification is made, so a title changed later still shows
|
|
* the old one. The `…Username` fields and the refs are joined when it is sent,
|
|
* so they follow a rename. The notification's `type` says which member it is.
|
|
*/
|
|
export type NotificationData =
|
|
| PlaylistFollowedData
|
|
| UserFollowedData
|
|
| UserDumpPostedData
|
|
| PlaylistDumpAddedData
|
|
| DumpUpvotedData
|
|
| UserMentionedData
|
|
| DumpCommentedData
|
|
| CommentLikedData;
|
|
|
|
/**
|
|
* Pushed to its user's sockets in a `notification_created` message when it is
|
|
* made, and returned by `GET /api/me/notifications`.
|
|
*/
|
|
export interface Notification {
|
|
id: string;
|
|
userId: string;
|
|
type: NotificationType;
|
|
data: NotificationData;
|
|
read: boolean;
|
|
createdAt: Date;
|
|
}
|