/** * 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"; /** * Carried by a `playlist_followed` notification, sent to a playlist's owner. */ export interface PlaylistFollowedData { 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 { 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 { dumpId: string; dumpTitle: string; playlistId: string; playlistTitle: string; } /** Carried by a `dump_upvoted` notification, sent to the dump's poster. */ export interface DumpUpvotedData { 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. */ export interface UserMentionedData { 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 { 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 { likerId: string; likerUsername: string; commentId: string; dumpId: string; dumpTitle: string; } /** * A snapshot taken when the notification is made: a name or title changed * later still shows the old one. 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/notifications`. */ export interface Notification { id: string; userId: string; type: NotificationType; data: NotificationData; read: boolean; createdAt: Date; }