diff --git a/backend/src/models/SocialMedia.js b/backend/src/models/SocialMedia.js index d41391ec1..42d2da30e 100644 --- a/backend/src/models/SocialMedia.js +++ b/backend/src/models/SocialMedia.js @@ -8,7 +8,7 @@ module.exports = { type: 'relationship', relationship: 'OWNED_BY', target: 'User', - direction: 'in', + direction: 'out', eager: true, cascade: 'detach', }, diff --git a/backend/src/schema/resolvers/socialMedia.js b/backend/src/schema/resolvers/socialMedia.js index d67a41636..49aa6788d 100644 --- a/backend/src/schema/resolvers/socialMedia.js +++ b/backend/src/schema/resolvers/socialMedia.js @@ -32,7 +32,7 @@ export default { SocialMedia: Resolver('SocialMedia', { idAttribute: 'url', hasOne: { - ownedBy: '<-[:OWNED_BY]-(related:User)', + ownedBy: '-[:OWNED_BY]->(related:User)', }, }), } diff --git a/backend/src/schema/resolvers/users.js b/backend/src/schema/resolvers/users.js index 90bd15822..97bbcd13b 100644 --- a/backend/src/schema/resolvers/users.js +++ b/backend/src/schema/resolvers/users.js @@ -129,6 +129,12 @@ export default { SET user.deleted = true SET user.name = 'UNAVAILABLE' SET user.about = 'UNAVAILABLE' + WITH user + OPTIONAL MATCH (user)<-[:BELONGS_TO]-(email:EmailAddress) + DETACH DELETE email + WITH user + OPTIONAL MATCH (user)<-[:OWNED_BY]-(socialMedia:SocialMedia) + DETACH DELETE socialMedia RETURN user`, { userId: context.user.id }, ) @@ -185,7 +191,7 @@ export default { followedBy: '<-[:FOLLOWS]-(related:User)', following: '-[:FOLLOWS]->(related:User)', friends: '-[:FRIENDS]-(related:User)', - socialMedia: '-[:OWNED_BY]->(related:SocialMedia', + socialMedia: '<-[:OWNED_BY]-(related:SocialMedia)', contributions: '-[:WROTE]->(related:Post)', comments: '-[:WROTE]->(related:Comment)', shouted: '-[:SHOUTED]->(related:Post)', diff --git a/backend/src/schema/resolvers/users.spec.js b/backend/src/schema/resolvers/users.spec.js index 82174a2bf..5c0f7919c 100644 --- a/backend/src/schema/resolvers/users.spec.js +++ b/backend/src/schema/resolvers/users.spec.js @@ -50,8 +50,9 @@ describe('User', () => { const variables = { email: 'any-email-address@example.org' } it('is forbidden', async () => { - const { errors } = await query({ query: userQuery, variables }) - expect(errors[0]).toHaveProperty('message', 'Not Authorised!') + await expect(query({ query: userQuery, variables })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorised!' }], + }) }) describe('as admin', () => { @@ -439,6 +440,27 @@ describe('DeleteUser', () => { }) }) }) + + describe('connected `EmailAddress` nodes', () => { + it('will be removed completely', async () => { + await expect(neode.all('EmailAddress')).resolves.toHaveLength(2) + await mutate({ mutation: deleteUserMutation, variables }) + await expect(neode.all('EmailAddress')).resolves.toHaveLength(1) + }) + }) + + describe('connected `SocialMedia` nodes', () => { + beforeEach(async () => { + const socialMedia = await factory.create('SocialMedia') + await socialMedia.relateTo(user, 'ownedBy') + }) + + it('will be removed completely', async () => { + await expect(neode.all('SocialMedia')).resolves.toHaveLength(1) + await mutate({ mutation: deleteUserMutation, variables }) + await expect(neode.all('SocialMedia')).resolves.toHaveLength(0) + }) + }) }) }) }) diff --git a/backend/src/schema/types/type/User.gql b/backend/src/schema/types/type/User.gql index 9bbef50e4..6151d0708 100644 --- a/backend/src/schema/types/type/User.gql +++ b/backend/src/schema/types/type/User.gql @@ -17,7 +17,7 @@ type User { location: Location @cypher(statement: "MATCH (this)-[:IS_IN]->(l:Location) RETURN l") locationName: String about: String - socialMedia: [SocialMedia]! @relation(name: "OWNED_BY", direction: "OUT") + socialMedia: [SocialMedia]! @relation(name: "OWNED_BY", direction: "IN") #createdAt: DateTime #updatedAt: DateTime diff --git a/backend/src/seed/factories/index.js b/backend/src/seed/factories/index.js index 1689be5e9..620a53183 100644 --- a/backend/src/seed/factories/index.js +++ b/backend/src/seed/factories/index.js @@ -6,6 +6,7 @@ import createPost from './posts.js' import createComment from './comments.js' import createCategory from './categories.js' import createTag from './tags.js' +import createSocialMedia from './socialMedia.js' export const seedServerHost = 'http://127.0.0.1:4001' @@ -26,6 +27,7 @@ const factories = { Comment: createComment, Category: createCategory, Tag: createTag, + SocialMedia: createSocialMedia, } export const cleanDatabase = async (options = {}) => { diff --git a/backend/src/seed/factories/socialMedia.js b/backend/src/seed/factories/socialMedia.js new file mode 100644 index 000000000..49a237cef --- /dev/null +++ b/backend/src/seed/factories/socialMedia.js @@ -0,0 +1,14 @@ +export default function create() { + return { + factory: async ({ args, neodeInstance }) => { + const defaults = { + url: 'https://mastodon.social/@Gargron', + } + args = { + ...defaults, + ...args, + } + return neodeInstance.create('SocialMedia', args) + }, + } +}