diff --git a/backend/src/middleware/permissionsMiddleware.ts b/backend/src/middleware/permissionsMiddleware.ts index 1fc84b665..a38610efd 100644 --- a/backend/src/middleware/permissionsMiddleware.ts +++ b/backend/src/middleware/permissionsMiddleware.ts @@ -462,6 +462,7 @@ export default shield( switchUserRole: isAdmin, markTeaserAsViewed: allow, saveCategorySettings: isAuthenticated, + updateOnlineStatus: isAuthenticated, CreateRoom: isAuthenticated, CreateMessage: isAuthenticated, MarkMessagesAsSeen: isAuthenticated, diff --git a/backend/src/models/User.ts b/backend/src/models/User.ts index b8d024216..6d95ec4a4 100644 --- a/backend/src/models/User.ts +++ b/backend/src/models/User.ts @@ -54,6 +54,7 @@ export default { }, invitedBy: { type: 'relationship', relationship: 'INVITED', target: 'User', direction: 'in' }, lastActiveAt: { type: 'string', isoDate: true }, + lastOnlineStatus: { type: 'string' }, createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, updatedAt: { type: 'string', diff --git a/backend/src/schema/resolvers/users.ts b/backend/src/schema/resolvers/users.ts index 6f79a4ea9..da36b3316 100644 --- a/backend/src/schema/resolvers/users.ts +++ b/backend/src/schema/resolvers/users.ts @@ -314,6 +314,26 @@ export default { session.close() } }, + updateOnlineStatus: async (object, args, context, resolveInfo) => { + const { status } = args + const { + user: { id }, + } = context + + // Last Online Time is saved as `lastActiveAt` + const session = context.driver.session() + await session.writeTransaction((transaction) => { + return transaction.run( + ` + MATCH (user:User {id: $id}) + SET user.lastOnlineStatus = $status + `, + { id, status }, + ) + }) + + return true + }, }, User: { email: async (parent, params, context, resolveInfo) => { diff --git a/backend/src/schema/types/enum/OnlineStatus.gql b/backend/src/schema/types/enum/OnlineStatus.gql new file mode 100644 index 000000000..7827ddb0b --- /dev/null +++ b/backend/src/schema/types/enum/OnlineStatus.gql @@ -0,0 +1,4 @@ +enum OnlineStatus { + online + away +} diff --git a/backend/src/schema/types/type/User.gql b/backend/src/schema/types/type/User.gql index f406e4e45..70b10aa42 100644 --- a/backend/src/schema/types/type/User.gql +++ b/backend/src/schema/types/type/User.gql @@ -224,6 +224,8 @@ type Mutation { switchUserRole(role: UserRole!, id: ID!): User saveCategorySettings(activeCategories: [String]): Boolean + + updateOnlineStatus(status: OnlineStatus!): Boolean! requestPasswordReset(email: String!): Boolean! resetPassword(email: String!, nonce: String!, newPassword: String!): Boolean!