mirror of
https://github.com/Ocelot-Social-Community/Ocelot-Social.git
synced 2025-12-13 07:46:06 +00:00
Merge branch 'master' of github.com:Human-Connection/Human-Connection into 967-filter-post-by-category
This commit is contained in:
commit
cf6ace59aa
@ -48,7 +48,7 @@
|
|||||||
"apollo-client": "~2.6.3",
|
"apollo-client": "~2.6.3",
|
||||||
"apollo-link-context": "~1.0.18",
|
"apollo-link-context": "~1.0.18",
|
||||||
"apollo-link-http": "~1.5.15",
|
"apollo-link-http": "~1.5.15",
|
||||||
"apollo-server": "~2.6.8",
|
"apollo-server": "~2.6.9",
|
||||||
"bcryptjs": "~2.4.3",
|
"bcryptjs": "~2.4.3",
|
||||||
"cheerio": "~1.0.0-rc.3",
|
"cheerio": "~1.0.0-rc.3",
|
||||||
"cors": "~2.8.5",
|
"cors": "~2.8.5",
|
||||||
|
|||||||
@ -11,6 +11,7 @@ export const signupTemplate = options => {
|
|||||||
} = options
|
} = options
|
||||||
const actionUrl = new URL('/registration/create-user-account', CONFIG.CLIENT_URI)
|
const actionUrl = new URL('/registration/create-user-account', CONFIG.CLIENT_URI)
|
||||||
actionUrl.searchParams.set('nonce', nonce)
|
actionUrl.searchParams.set('nonce', nonce)
|
||||||
|
actionUrl.searchParams.set('email', email)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
to: email,
|
to: email,
|
||||||
|
|||||||
@ -146,6 +146,7 @@ const permissions = shield(
|
|||||||
Comment: allow,
|
Comment: allow,
|
||||||
User: or(noEmailFilter, isAdmin),
|
User: or(noEmailFilter, isAdmin),
|
||||||
isLoggedIn: allow,
|
isLoggedIn: allow,
|
||||||
|
Badge: allow,
|
||||||
},
|
},
|
||||||
Mutation: {
|
Mutation: {
|
||||||
'*': deny,
|
'*': deny,
|
||||||
@ -160,9 +161,6 @@ const permissions = shield(
|
|||||||
UpdatePost: isAuthor,
|
UpdatePost: isAuthor,
|
||||||
DeletePost: isAuthor,
|
DeletePost: isAuthor,
|
||||||
report: isAuthenticated,
|
report: isAuthenticated,
|
||||||
CreateBadge: isAdmin,
|
|
||||||
UpdateBadge: isAdmin,
|
|
||||||
DeleteBadge: isAdmin,
|
|
||||||
CreateSocialMedia: isAuthenticated,
|
CreateSocialMedia: isAuthenticated,
|
||||||
DeleteSocialMedia: isAuthenticated,
|
DeleteSocialMedia: isAuthenticated,
|
||||||
// AddBadgeRewarded: isAdmin,
|
// AddBadgeRewarded: isAdmin,
|
||||||
|
|||||||
@ -1,6 +1,9 @@
|
|||||||
import { UserInputError } from 'apollo-server'
|
import { UserInputError } from 'apollo-server'
|
||||||
import Joi from '@hapi/joi'
|
import Joi from '@hapi/joi'
|
||||||
|
|
||||||
|
const COMMENT_MIN_LENGTH = 1
|
||||||
|
const NO_POST_ERR_MESSAGE = 'Comment cannot be created without a post!'
|
||||||
|
|
||||||
const validate = schema => {
|
const validate = schema => {
|
||||||
return async (resolve, root, args, context, info) => {
|
return async (resolve, root, args, context, info) => {
|
||||||
const validation = schema.validate(args)
|
const validation = schema.validate(args)
|
||||||
@ -15,8 +18,36 @@ const socialMediaSchema = Joi.object().keys({
|
|||||||
.required(),
|
.required(),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const validateCommentCreation = async (resolve, root, args, context, info) => {
|
||||||
|
const content = args.content.replace(/<(?:.|\n)*?>/gm, '').trim()
|
||||||
|
const { postId } = args
|
||||||
|
|
||||||
|
if (!args.content || content.length < COMMENT_MIN_LENGTH) {
|
||||||
|
throw new UserInputError(`Comment must be at least ${COMMENT_MIN_LENGTH} character long!`)
|
||||||
|
}
|
||||||
|
const session = context.driver.session()
|
||||||
|
const postQueryRes = await session.run(
|
||||||
|
`
|
||||||
|
MATCH (post:Post {id: $postId})
|
||||||
|
RETURN post`,
|
||||||
|
{
|
||||||
|
postId,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
const [post] = postQueryRes.records.map(record => {
|
||||||
|
return record.get('post')
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!post) {
|
||||||
|
throw new UserInputError(NO_POST_ERR_MESSAGE)
|
||||||
|
} else {
|
||||||
|
return resolve(root, args, context, info)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
Mutation: {
|
Mutation: {
|
||||||
CreateSocialMedia: validate(socialMediaSchema),
|
CreateSocialMedia: validate(socialMediaSchema),
|
||||||
|
CreateComment: validateCommentCreation,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
7
backend/src/models/Badge.js
Normal file
7
backend/src/models/Badge.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
module.exports = {
|
||||||
|
id: { type: 'string', primary: true, lowercase: true },
|
||||||
|
status: { type: 'string', valid: ['permanent', 'temporary'] },
|
||||||
|
type: { type: 'string', valid: ['role', 'crowdfunding'] },
|
||||||
|
icon: { type: 'string', required: true },
|
||||||
|
createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() },
|
||||||
|
}
|
||||||
@ -43,6 +43,12 @@ module.exports = {
|
|||||||
target: 'User',
|
target: 'User',
|
||||||
direction: 'in',
|
direction: 'in',
|
||||||
},
|
},
|
||||||
|
rewarded: {
|
||||||
|
type: 'relationship',
|
||||||
|
relationship: 'REWARDED',
|
||||||
|
target: 'Badge',
|
||||||
|
direction: 'in',
|
||||||
|
},
|
||||||
invitedBy: { type: 'relationship', relationship: 'INVITED', target: 'User', direction: 'in' },
|
invitedBy: { type: 'relationship', relationship: 'INVITED', target: 'User', direction: 'in' },
|
||||||
createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() },
|
createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() },
|
||||||
updatedAt: {
|
updatedAt: {
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
// NOTE: We cannot use `fs` here to clean up the code. Cypress breaks on any npm
|
// NOTE: We cannot use `fs` here to clean up the code. Cypress breaks on any npm
|
||||||
// module that is not browser-compatible. Node's `fs` module is server-side only
|
// module that is not browser-compatible. Node's `fs` module is server-side only
|
||||||
export default {
|
export default {
|
||||||
|
Badge: require('./Badge.js'),
|
||||||
User: require('./User.js'),
|
User: require('./User.js'),
|
||||||
InvitationCode: require('./InvitationCode.js'),
|
InvitationCode: require('./InvitationCode.js'),
|
||||||
EmailAddress: require('./EmailAddress.js'),
|
EmailAddress: require('./EmailAddress.js'),
|
||||||
|
|||||||
@ -12,11 +12,25 @@ export default applyScalars(
|
|||||||
resolvers,
|
resolvers,
|
||||||
config: {
|
config: {
|
||||||
query: {
|
query: {
|
||||||
exclude: ['InvitationCode', 'EmailAddress', 'Notfication', 'Statistics', 'LoggedInUser'],
|
exclude: [
|
||||||
|
'Badge',
|
||||||
|
'InvitationCode',
|
||||||
|
'EmailAddress',
|
||||||
|
'Notfication',
|
||||||
|
'Statistics',
|
||||||
|
'LoggedInUser',
|
||||||
|
],
|
||||||
// add 'User' here as soon as possible
|
// add 'User' here as soon as possible
|
||||||
},
|
},
|
||||||
mutation: {
|
mutation: {
|
||||||
exclude: ['InvitationCode', 'EmailAddress', 'Notfication', 'Statistics', 'LoggedInUser'],
|
exclude: [
|
||||||
|
'Badge',
|
||||||
|
'InvitationCode',
|
||||||
|
'EmailAddress',
|
||||||
|
'Notfication',
|
||||||
|
'Statistics',
|
||||||
|
'LoggedInUser',
|
||||||
|
],
|
||||||
// add 'User' here as soon as possible
|
// add 'User' here as soon as possible
|
||||||
},
|
},
|
||||||
debug: CONFIG.DEBUG,
|
debug: CONFIG.DEBUG,
|
||||||
|
|||||||
9
backend/src/schema/resolvers/badges.js
Normal file
9
backend/src/schema/resolvers/badges.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import { neo4jgraphql } from 'neo4j-graphql-js'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
Query: {
|
||||||
|
Badge: async (object, args, context, resolveInfo) => {
|
||||||
|
return neo4jgraphql(object, args, context, resolveInfo, false)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
@ -1,200 +0,0 @@
|
|||||||
import { GraphQLClient } from 'graphql-request'
|
|
||||||
import Factory from '../../seed/factories'
|
|
||||||
import { host, login } from '../../jest/helpers'
|
|
||||||
|
|
||||||
const factory = Factory()
|
|
||||||
let client
|
|
||||||
|
|
||||||
describe('badges', () => {
|
|
||||||
beforeEach(async () => {
|
|
||||||
await factory.create('User', {
|
|
||||||
email: 'user@example.org',
|
|
||||||
role: 'user',
|
|
||||||
password: '1234',
|
|
||||||
})
|
|
||||||
await factory.create('User', {
|
|
||||||
id: 'u2',
|
|
||||||
role: 'moderator',
|
|
||||||
email: 'moderator@example.org',
|
|
||||||
})
|
|
||||||
await factory.create('User', {
|
|
||||||
id: 'u3',
|
|
||||||
role: 'admin',
|
|
||||||
email: 'admin@example.org',
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
afterEach(async () => {
|
|
||||||
await factory.cleanDatabase()
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('CreateBadge', () => {
|
|
||||||
const variables = {
|
|
||||||
id: 'b1',
|
|
||||||
key: 'indiegogo_en_racoon',
|
|
||||||
type: 'crowdfunding',
|
|
||||||
status: 'permanent',
|
|
||||||
icon: '/img/badges/indiegogo_en_racoon.svg',
|
|
||||||
}
|
|
||||||
|
|
||||||
const mutation = `
|
|
||||||
mutation(
|
|
||||||
$id: ID
|
|
||||||
$key: String!
|
|
||||||
$type: BadgeType!
|
|
||||||
$status: BadgeStatus!
|
|
||||||
$icon: String!
|
|
||||||
) {
|
|
||||||
CreateBadge(id: $id, key: $key, type: $type, status: $status, icon: $icon) {
|
|
||||||
id,
|
|
||||||
key,
|
|
||||||
type,
|
|
||||||
status,
|
|
||||||
icon
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
||||||
describe('unauthenticated', () => {
|
|
||||||
it('throws authorization error', async () => {
|
|
||||||
client = new GraphQLClient(host)
|
|
||||||
await expect(client.request(mutation, variables)).rejects.toThrow('Not Authorised')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('authenticated admin', () => {
|
|
||||||
beforeEach(async () => {
|
|
||||||
const headers = await login({ email: 'admin@example.org', password: '1234' })
|
|
||||||
client = new GraphQLClient(host, { headers })
|
|
||||||
})
|
|
||||||
it('creates a badge', async () => {
|
|
||||||
const expected = {
|
|
||||||
CreateBadge: {
|
|
||||||
icon: '/img/badges/indiegogo_en_racoon.svg',
|
|
||||||
id: 'b1',
|
|
||||||
key: 'indiegogo_en_racoon',
|
|
||||||
status: 'permanent',
|
|
||||||
type: 'crowdfunding',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
await expect(client.request(mutation, variables)).resolves.toEqual(expected)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('authenticated moderator', () => {
|
|
||||||
beforeEach(async () => {
|
|
||||||
const headers = await login({ email: 'moderator@example.org', password: '1234' })
|
|
||||||
client = new GraphQLClient(host, { headers })
|
|
||||||
})
|
|
||||||
|
|
||||||
it('throws authorization error', async () => {
|
|
||||||
await expect(client.request(mutation, variables)).rejects.toThrow('Not Authorised')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('UpdateBadge', () => {
|
|
||||||
beforeEach(async () => {
|
|
||||||
await factory.authenticateAs({ email: 'admin@example.org', password: '1234' })
|
|
||||||
await factory.create('Badge', { id: 'b1' })
|
|
||||||
})
|
|
||||||
const variables = {
|
|
||||||
id: 'b1',
|
|
||||||
key: 'whatever',
|
|
||||||
}
|
|
||||||
|
|
||||||
const mutation = `
|
|
||||||
mutation($id: ID!, $key: String!) {
|
|
||||||
UpdateBadge(id: $id, key: $key) {
|
|
||||||
id
|
|
||||||
key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
||||||
describe('unauthenticated', () => {
|
|
||||||
it('throws authorization error', async () => {
|
|
||||||
client = new GraphQLClient(host)
|
|
||||||
await expect(client.request(mutation, variables)).rejects.toThrow('Not Authorised')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('authenticated moderator', () => {
|
|
||||||
beforeEach(async () => {
|
|
||||||
const headers = await login({ email: 'moderator@example.org', password: '1234' })
|
|
||||||
client = new GraphQLClient(host, { headers })
|
|
||||||
})
|
|
||||||
|
|
||||||
it('throws authorization error', async () => {
|
|
||||||
await expect(client.request(mutation, variables)).rejects.toThrow('Not Authorised')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('authenticated admin', () => {
|
|
||||||
beforeEach(async () => {
|
|
||||||
const headers = await login({ email: 'admin@example.org', password: '1234' })
|
|
||||||
client = new GraphQLClient(host, { headers })
|
|
||||||
})
|
|
||||||
it('updates a badge', async () => {
|
|
||||||
const expected = {
|
|
||||||
UpdateBadge: {
|
|
||||||
id: 'b1',
|
|
||||||
key: 'whatever',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
await expect(client.request(mutation, variables)).resolves.toEqual(expected)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('DeleteBadge', () => {
|
|
||||||
beforeEach(async () => {
|
|
||||||
await factory.authenticateAs({ email: 'admin@example.org', password: '1234' })
|
|
||||||
await factory.create('Badge', { id: 'b1' })
|
|
||||||
})
|
|
||||||
const variables = {
|
|
||||||
id: 'b1',
|
|
||||||
}
|
|
||||||
|
|
||||||
const mutation = `
|
|
||||||
mutation($id: ID!) {
|
|
||||||
DeleteBadge(id: $id) {
|
|
||||||
id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
||||||
describe('unauthenticated', () => {
|
|
||||||
it('throws authorization error', async () => {
|
|
||||||
client = new GraphQLClient(host)
|
|
||||||
await expect(client.request(mutation, variables)).rejects.toThrow('Not Authorised')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('authenticated moderator', () => {
|
|
||||||
beforeEach(async () => {
|
|
||||||
const headers = await login({ email: 'moderator@example.org', password: '1234' })
|
|
||||||
client = new GraphQLClient(host, { headers })
|
|
||||||
})
|
|
||||||
|
|
||||||
it('throws authorization error', async () => {
|
|
||||||
await expect(client.request(mutation, variables)).rejects.toThrow('Not Authorised')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('authenticated admin', () => {
|
|
||||||
beforeEach(async () => {
|
|
||||||
const headers = await login({ email: 'admin@example.org', password: '1234' })
|
|
||||||
client = new GraphQLClient(host, { headers })
|
|
||||||
})
|
|
||||||
it('deletes a badge', async () => {
|
|
||||||
const expected = {
|
|
||||||
DeleteBadge: {
|
|
||||||
id: 'b1',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
await expect(client.request(mutation, variables)).resolves.toEqual(expected)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
@ -1,40 +1,15 @@
|
|||||||
import { neo4jgraphql } from 'neo4j-graphql-js'
|
import { neo4jgraphql } from 'neo4j-graphql-js'
|
||||||
import { UserInputError } from 'apollo-server'
|
|
||||||
|
|
||||||
const COMMENT_MIN_LENGTH = 1
|
|
||||||
const NO_POST_ERR_MESSAGE = 'Comment cannot be created without a post!'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
Mutation: {
|
Mutation: {
|
||||||
CreateComment: async (object, params, context, resolveInfo) => {
|
CreateComment: async (object, params, context, resolveInfo) => {
|
||||||
const content = params.content.replace(/<(?:.|\n)*?>/gm, '').trim()
|
|
||||||
const { postId } = params
|
const { postId } = params
|
||||||
// Adding relationship from comment to post by passing in the postId,
|
// Adding relationship from comment to post by passing in the postId,
|
||||||
// but we do not want to create the comment with postId as an attribute
|
// but we do not want to create the comment with postId as an attribute
|
||||||
// because we use relationships for this. So, we are deleting it from params
|
// because we use relationships for this. So, we are deleting it from params
|
||||||
// before comment creation.
|
// before comment creation.
|
||||||
delete params.postId
|
delete params.postId
|
||||||
|
|
||||||
if (!params.content || content.length < COMMENT_MIN_LENGTH) {
|
|
||||||
throw new UserInputError(`Comment must be at least ${COMMENT_MIN_LENGTH} character long!`)
|
|
||||||
}
|
|
||||||
|
|
||||||
const session = context.driver.session()
|
const session = context.driver.session()
|
||||||
const postQueryRes = await session.run(
|
|
||||||
`
|
|
||||||
MATCH (post:Post {id: $postId})
|
|
||||||
RETURN post`,
|
|
||||||
{
|
|
||||||
postId,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
const [post] = postQueryRes.records.map(record => {
|
|
||||||
return record.get('post')
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!post) {
|
|
||||||
throw new UserInputError(NO_POST_ERR_MESSAGE)
|
|
||||||
}
|
|
||||||
const commentWithoutRelationships = await neo4jgraphql(
|
const commentWithoutRelationships = await neo4jgraphql(
|
||||||
object,
|
object,
|
||||||
params,
|
params,
|
||||||
|
|||||||
@ -1,47 +1,47 @@
|
|||||||
|
import { neode } from '../../bootstrap/neo4j'
|
||||||
|
import { UserInputError } from 'apollo-server'
|
||||||
|
|
||||||
|
const instance = neode()
|
||||||
|
|
||||||
|
const getUserAndBadge = async ({ badgeKey, userId }) => {
|
||||||
|
let user = await instance.first('User', 'id', userId)
|
||||||
|
const badge = await instance.first('Badge', 'id', badgeKey)
|
||||||
|
if (!user) throw new UserInputError("Couldn't find a user with that id")
|
||||||
|
if (!badge) throw new UserInputError("Couldn't find a badge with that id")
|
||||||
|
return { user, badge }
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
Mutation: {
|
Mutation: {
|
||||||
reward: async (_object, params, context, _resolveInfo) => {
|
reward: async (_object, params, context, _resolveInfo) => {
|
||||||
const { fromBadgeId, toUserId } = params
|
const { user, badge } = await getUserAndBadge(params)
|
||||||
const session = context.driver.session()
|
await user.relateTo(badge, 'rewarded')
|
||||||
|
return user.toJson()
|
||||||
let transactionRes = await session.run(
|
|
||||||
`MATCH (badge:Badge {id: $badgeId}), (rewardedUser:User {id: $rewardedUserId})
|
|
||||||
MERGE (badge)-[:REWARDED]->(rewardedUser)
|
|
||||||
RETURN rewardedUser {.id}`,
|
|
||||||
{
|
|
||||||
badgeId: fromBadgeId,
|
|
||||||
rewardedUserId: toUserId,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
const [rewardedUser] = transactionRes.records.map(record => {
|
|
||||||
return record.get('rewardedUser')
|
|
||||||
})
|
|
||||||
|
|
||||||
session.close()
|
|
||||||
|
|
||||||
return rewardedUser.id
|
|
||||||
},
|
},
|
||||||
|
|
||||||
unreward: async (_object, params, context, _resolveInfo) => {
|
unreward: async (_object, params, context, _resolveInfo) => {
|
||||||
const { fromBadgeId, toUserId } = params
|
const { badgeKey, userId } = params
|
||||||
|
const { user } = await getUserAndBadge(params)
|
||||||
const session = context.driver.session()
|
const session = context.driver.session()
|
||||||
|
try {
|
||||||
let transactionRes = await session.run(
|
// silly neode cannot remove relationships
|
||||||
`MATCH (badge:Badge {id: $badgeId})-[reward:REWARDED]->(rewardedUser:User {id: $rewardedUserId})
|
await session.run(
|
||||||
DELETE reward
|
`
|
||||||
RETURN rewardedUser {.id}`,
|
MATCH (badge:Badge {id: $badgeKey})-[reward:REWARDED]->(rewardedUser:User {id: $userId})
|
||||||
{
|
DELETE reward
|
||||||
badgeId: fromBadgeId,
|
RETURN rewardedUser
|
||||||
rewardedUserId: toUserId,
|
`,
|
||||||
},
|
{
|
||||||
)
|
badgeKey,
|
||||||
const [rewardedUser] = transactionRes.records.map(record => {
|
userId,
|
||||||
return record.get('rewardedUser')
|
},
|
||||||
})
|
)
|
||||||
session.close()
|
} catch (err) {
|
||||||
|
throw err
|
||||||
return rewardedUser.id
|
} finally {
|
||||||
|
session.close()
|
||||||
|
}
|
||||||
|
return user.toJson()
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,12 +1,20 @@
|
|||||||
import { GraphQLClient } from 'graphql-request'
|
import { GraphQLClient } from 'graphql-request'
|
||||||
import Factory from '../../seed/factories'
|
import Factory from '../../seed/factories'
|
||||||
import { host, login } from '../../jest/helpers'
|
import { host, login } from '../../jest/helpers'
|
||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
const factory = Factory()
|
const factory = Factory()
|
||||||
|
let user
|
||||||
|
let badge
|
||||||
|
|
||||||
describe('rewards', () => {
|
describe('rewards', () => {
|
||||||
|
const variables = {
|
||||||
|
from: 'indiegogo_en_rhino',
|
||||||
|
to: 'u1',
|
||||||
|
}
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await factory.create('User', {
|
user = await factory.create('User', {
|
||||||
id: 'u1',
|
id: 'u1',
|
||||||
role: 'user',
|
role: 'user',
|
||||||
email: 'user@example.org',
|
email: 'user@example.org',
|
||||||
@ -22,9 +30,8 @@ describe('rewards', () => {
|
|||||||
role: 'admin',
|
role: 'admin',
|
||||||
email: 'admin@example.org',
|
email: 'admin@example.org',
|
||||||
})
|
})
|
||||||
await factory.create('Badge', {
|
badge = await factory.create('Badge', {
|
||||||
id: 'b6',
|
id: 'indiegogo_en_rhino',
|
||||||
key: 'indiegogo_en_rhino',
|
|
||||||
type: 'crowdfunding',
|
type: 'crowdfunding',
|
||||||
status: 'permanent',
|
status: 'permanent',
|
||||||
icon: '/img/badges/indiegogo_en_rhino.svg',
|
icon: '/img/badges/indiegogo_en_rhino.svg',
|
||||||
@ -35,21 +42,19 @@ describe('rewards', () => {
|
|||||||
await factory.cleanDatabase()
|
await factory.cleanDatabase()
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('RewardBadge', () => {
|
describe('reward', () => {
|
||||||
const mutation = `
|
const mutation = gql`
|
||||||
mutation(
|
mutation($from: ID!, $to: ID!) {
|
||||||
$from: ID!
|
reward(badgeKey: $from, userId: $to) {
|
||||||
$to: ID!
|
id
|
||||||
) {
|
badges {
|
||||||
reward(fromBadgeId: $from, toUserId: $to)
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
describe('unauthenticated', () => {
|
describe('unauthenticated', () => {
|
||||||
const variables = {
|
|
||||||
from: 'b6',
|
|
||||||
to: 'u1',
|
|
||||||
}
|
|
||||||
let client
|
let client
|
||||||
|
|
||||||
it('throws authorization error', async () => {
|
it('throws authorization error', async () => {
|
||||||
@ -65,74 +70,94 @@ describe('rewards', () => {
|
|||||||
client = new GraphQLClient(host, { headers })
|
client = new GraphQLClient(host, { headers })
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('badge for id does not exist', () => {
|
||||||
|
it('rejects with a telling error message', async () => {
|
||||||
|
await expect(
|
||||||
|
client.request(mutation, {
|
||||||
|
...variables,
|
||||||
|
from: 'bullshit',
|
||||||
|
}),
|
||||||
|
).rejects.toThrow("Couldn't find a badge with that id")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('user for id does not exist', () => {
|
||||||
|
it('rejects with a telling error message', async () => {
|
||||||
|
await expect(
|
||||||
|
client.request(mutation, {
|
||||||
|
...variables,
|
||||||
|
to: 'bullshit',
|
||||||
|
}),
|
||||||
|
).rejects.toThrow("Couldn't find a user with that id")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
it('rewards a badge to user', async () => {
|
it('rewards a badge to user', async () => {
|
||||||
const variables = {
|
|
||||||
from: 'b6',
|
|
||||||
to: 'u1',
|
|
||||||
}
|
|
||||||
const expected = {
|
const expected = {
|
||||||
reward: 'u1',
|
reward: {
|
||||||
|
id: 'u1',
|
||||||
|
badges: [{ id: 'indiegogo_en_rhino' }],
|
||||||
|
},
|
||||||
}
|
}
|
||||||
await expect(client.request(mutation, variables)).resolves.toEqual(expected)
|
await expect(client.request(mutation, variables)).resolves.toEqual(expected)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('rewards a second different badge to same user', async () => {
|
it('rewards a second different badge to same user', async () => {
|
||||||
await factory.create('Badge', {
|
await factory.create('Badge', {
|
||||||
id: 'b1',
|
id: 'indiegogo_en_racoon',
|
||||||
key: 'indiegogo_en_racoon',
|
|
||||||
type: 'crowdfunding',
|
|
||||||
status: 'permanent',
|
|
||||||
icon: '/img/badges/indiegogo_en_racoon.svg',
|
icon: '/img/badges/indiegogo_en_racoon.svg',
|
||||||
})
|
})
|
||||||
const variables = {
|
|
||||||
from: 'b1',
|
|
||||||
to: 'u1',
|
|
||||||
}
|
|
||||||
const expected = {
|
const expected = {
|
||||||
reward: 'u1',
|
reward: {
|
||||||
|
id: 'u1',
|
||||||
|
badges: [{ id: 'indiegogo_en_racoon' }, { id: 'indiegogo_en_rhino' }],
|
||||||
|
},
|
||||||
}
|
}
|
||||||
await expect(client.request(mutation, variables)).resolves.toEqual(expected)
|
await client.request(mutation, variables)
|
||||||
|
await expect(
|
||||||
|
client.request(mutation, {
|
||||||
|
...variables,
|
||||||
|
from: 'indiegogo_en_racoon',
|
||||||
|
}),
|
||||||
|
).resolves.toEqual(expected)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('rewards the same badge as well to another user', async () => {
|
it('rewards the same badge as well to another user', async () => {
|
||||||
const variables1 = {
|
|
||||||
from: 'b6',
|
|
||||||
to: 'u1',
|
|
||||||
}
|
|
||||||
await client.request(mutation, variables1)
|
|
||||||
|
|
||||||
const variables2 = {
|
|
||||||
from: 'b6',
|
|
||||||
to: 'u2',
|
|
||||||
}
|
|
||||||
const expected = {
|
const expected = {
|
||||||
reward: 'u2',
|
reward: {
|
||||||
|
id: 'u2',
|
||||||
|
badges: [{ id: 'indiegogo_en_rhino' }],
|
||||||
|
},
|
||||||
}
|
}
|
||||||
await expect(client.request(mutation, variables2)).resolves.toEqual(expected)
|
await expect(
|
||||||
|
client.request(mutation, {
|
||||||
|
...variables,
|
||||||
|
to: 'u2',
|
||||||
|
}),
|
||||||
|
).resolves.toEqual(expected)
|
||||||
})
|
})
|
||||||
it('returns the original reward if a reward is attempted a second time', async () => {
|
|
||||||
const variables = {
|
it('creates no duplicate reward relationships', async () => {
|
||||||
from: 'b6',
|
|
||||||
to: 'u1',
|
|
||||||
}
|
|
||||||
await client.request(mutation, variables)
|
await client.request(mutation, variables)
|
||||||
await client.request(mutation, variables)
|
await client.request(mutation, variables)
|
||||||
|
|
||||||
const query = `{
|
const query = gql`
|
||||||
User( id: "u1" ) {
|
{
|
||||||
badgesCount
|
User(id: "u1") {
|
||||||
|
badgesCount
|
||||||
|
badges {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
`
|
`
|
||||||
const expected = { User: [{ badgesCount: 1 }] }
|
const expected = { User: [{ badgesCount: 1, badges: [{ id: 'indiegogo_en_rhino' }] }] }
|
||||||
|
|
||||||
await expect(client.request(query)).resolves.toEqual(expected)
|
await expect(client.request(query)).resolves.toEqual(expected)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('authenticated moderator', () => {
|
describe('authenticated moderator', () => {
|
||||||
const variables = {
|
|
||||||
from: 'b6',
|
|
||||||
to: 'u1',
|
|
||||||
}
|
|
||||||
let client
|
let client
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
const headers = await login({ email: 'moderator@example.org', password: '1234' })
|
const headers = await login({ email: 'moderator@example.org', password: '1234' })
|
||||||
@ -147,27 +172,41 @@ describe('rewards', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('RemoveReward', () => {
|
describe('unreward', () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await factory.relate('User', 'Badges', { from: 'b6', to: 'u1' })
|
await user.relateTo(badge, 'rewarded')
|
||||||
})
|
})
|
||||||
const variables = {
|
const expected = { unreward: { id: 'u1', badges: [] } }
|
||||||
from: 'b6',
|
|
||||||
to: 'u1',
|
|
||||||
}
|
|
||||||
const expected = {
|
|
||||||
unreward: 'u1',
|
|
||||||
}
|
|
||||||
|
|
||||||
const mutation = `
|
const mutation = gql`
|
||||||
mutation(
|
mutation($from: ID!, $to: ID!) {
|
||||||
$from: ID!
|
unreward(badgeKey: $from, userId: $to) {
|
||||||
$to: ID!
|
id
|
||||||
) {
|
badges {
|
||||||
unreward(fromBadgeId: $from, toUserId: $to)
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
|
describe('check test setup', () => {
|
||||||
|
it('user has one badge', async () => {
|
||||||
|
const query = gql`
|
||||||
|
{
|
||||||
|
User(id: "u1") {
|
||||||
|
badgesCount
|
||||||
|
badges {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
const expected = { User: [{ badgesCount: 1, badges: [{ id: 'indiegogo_en_rhino' }] }] }
|
||||||
|
const client = new GraphQLClient(host)
|
||||||
|
await expect(client.request(query)).resolves.toEqual(expected)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('unauthenticated', () => {
|
describe('unauthenticated', () => {
|
||||||
let client
|
let client
|
||||||
|
|
||||||
@ -188,12 +227,9 @@ describe('rewards', () => {
|
|||||||
await expect(client.request(mutation, variables)).resolves.toEqual(expected)
|
await expect(client.request(mutation, variables)).resolves.toEqual(expected)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('fails to remove a not existing badge from user', async () => {
|
it('does not crash when unrewarding multiple times', async () => {
|
||||||
await client.request(mutation, variables)
|
await client.request(mutation, variables)
|
||||||
|
await expect(client.request(mutation, variables)).resolves.toEqual(expected)
|
||||||
await expect(client.request(mutation, variables)).rejects.toThrow(
|
|
||||||
"Cannot read property 'id' of undefined",
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@ -139,7 +139,7 @@ export default {
|
|||||||
organizationsCreated: '-[:CREATED_ORGA]->(related:Organization)',
|
organizationsCreated: '-[:CREATED_ORGA]->(related:Organization)',
|
||||||
organizationsOwned: '-[:OWNING_ORGA]->(related:Organization)',
|
organizationsOwned: '-[:OWNING_ORGA]->(related:Organization)',
|
||||||
categories: '-[:CATEGORIZED]->(related:Category)',
|
categories: '-[:CATEGORIZED]->(related:Category)',
|
||||||
badges: '-[:REWARDED]->(related:Badge)',
|
badges: '<-[:REWARDED]-(related:Badge)',
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@ -147,7 +147,7 @@ describe('users', () => {
|
|||||||
}
|
}
|
||||||
`
|
`
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
asAuthor = await factory.create('User', {
|
await factory.create('User', {
|
||||||
email: 'test@example.org',
|
email: 'test@example.org',
|
||||||
password: '1234',
|
password: '1234',
|
||||||
id: 'u343',
|
id: 'u343',
|
||||||
@ -191,6 +191,7 @@ describe('users', () => {
|
|||||||
describe('attempting to delete my own account', () => {
|
describe('attempting to delete my own account', () => {
|
||||||
let expectedResponse
|
let expectedResponse
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
|
asAuthor = Factory()
|
||||||
await asAuthor.authenticateAs({
|
await asAuthor.authenticateAs({
|
||||||
email: 'test@example.org',
|
email: 'test@example.org',
|
||||||
password: '1234',
|
password: '1234',
|
||||||
|
|||||||
@ -1,4 +0,0 @@
|
|||||||
enum BadgeStatus {
|
|
||||||
permanent
|
|
||||||
temporary
|
|
||||||
}
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
enum BadgeType {
|
|
||||||
role
|
|
||||||
crowdfunding
|
|
||||||
}
|
|
||||||
@ -28,8 +28,6 @@ type Mutation {
|
|||||||
report(id: ID!, description: String): Report
|
report(id: ID!, description: String): Report
|
||||||
disable(id: ID!): ID
|
disable(id: ID!): ID
|
||||||
enable(id: ID!): ID
|
enable(id: ID!): ID
|
||||||
reward(fromBadgeId: ID!, toUserId: ID!): ID
|
|
||||||
unreward(fromBadgeId: ID!, toUserId: ID!): ID
|
|
||||||
# Shout the given Type and ID
|
# Shout the given Type and ID
|
||||||
shout(id: ID!, type: ShoutTypeEnum): Boolean!
|
shout(id: ID!, type: ShoutTypeEnum): Boolean!
|
||||||
# Unshout the given Type and ID
|
# Unshout the given Type and ID
|
||||||
|
|||||||
@ -1,324 +0,0 @@
|
|||||||
scalar Upload
|
|
||||||
|
|
||||||
type Query {
|
|
||||||
isLoggedIn: Boolean!
|
|
||||||
# Get the currently logged in User based on the given JWT Token
|
|
||||||
currentUser: User
|
|
||||||
# Get the latest Network Statistics
|
|
||||||
statistics: Statistics!
|
|
||||||
findPosts(filter: String!, limit: Int = 10): [Post]! @cypher(
|
|
||||||
statement: """
|
|
||||||
CALL db.index.fulltext.queryNodes('full_text_search', $filter)
|
|
||||||
YIELD node as post, score
|
|
||||||
MATCH (post)<-[:WROTE]-(user:User)
|
|
||||||
WHERE score >= 0.2
|
|
||||||
AND NOT user.deleted = true AND NOT user.disabled = true
|
|
||||||
AND NOT post.deleted = true AND NOT post.disabled = true
|
|
||||||
RETURN post
|
|
||||||
LIMIT $limit
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
CommentByPost(postId: ID!): [Comment]!
|
|
||||||
}
|
|
||||||
|
|
||||||
type Mutation {
|
|
||||||
# Get a JWT Token for the given Email and password
|
|
||||||
login(email: String!, password: String!): String!
|
|
||||||
signup(email: String!, password: String!): Boolean!
|
|
||||||
changePassword(oldPassword:String!, newPassword: String!): String!
|
|
||||||
report(id: ID!, description: String): Report
|
|
||||||
disable(id: ID!): ID
|
|
||||||
enable(id: ID!): ID
|
|
||||||
reward(fromBadgeId: ID!, toUserId: ID!): ID
|
|
||||||
unreward(fromBadgeId: ID!, toUserId: ID!): ID
|
|
||||||
# Shout the given Type and ID
|
|
||||||
shout(id: ID!, type: ShoutTypeEnum): Boolean!
|
|
||||||
# Unshout the given Type and ID
|
|
||||||
unshout(id: ID!, type: ShoutTypeEnum): Boolean!
|
|
||||||
# Follow the given Type and ID
|
|
||||||
follow(id: ID!, type: FollowTypeEnum): Boolean!
|
|
||||||
# Unfollow the given Type and ID
|
|
||||||
unfollow(id: ID!, type: FollowTypeEnum): Boolean!
|
|
||||||
}
|
|
||||||
|
|
||||||
type Statistics {
|
|
||||||
countUsers: Int!
|
|
||||||
countPosts: Int!
|
|
||||||
countComments: Int!
|
|
||||||
countNotifications: Int!
|
|
||||||
countOrganizations: Int!
|
|
||||||
countProjects: Int!
|
|
||||||
countInvites: Int!
|
|
||||||
countFollows: Int!
|
|
||||||
countShouts: Int!
|
|
||||||
}
|
|
||||||
|
|
||||||
type Notification {
|
|
||||||
id: ID!
|
|
||||||
read: Boolean,
|
|
||||||
user: User @relation(name: "NOTIFIED", direction: "OUT")
|
|
||||||
post: Post @relation(name: "NOTIFIED", direction: "IN")
|
|
||||||
createdAt: String
|
|
||||||
}
|
|
||||||
|
|
||||||
scalar Date
|
|
||||||
scalar Time
|
|
||||||
scalar DateTime
|
|
||||||
|
|
||||||
enum VisibilityEnum {
|
|
||||||
public
|
|
||||||
friends
|
|
||||||
private
|
|
||||||
}
|
|
||||||
|
|
||||||
enum UserGroupEnum {
|
|
||||||
admin
|
|
||||||
moderator
|
|
||||||
user
|
|
||||||
}
|
|
||||||
|
|
||||||
type Location {
|
|
||||||
id: ID!
|
|
||||||
name: String!
|
|
||||||
nameEN: String
|
|
||||||
nameDE: String
|
|
||||||
nameFR: String
|
|
||||||
nameNL: String
|
|
||||||
nameIT: String
|
|
||||||
nameES: String
|
|
||||||
namePT: String
|
|
||||||
namePL: String
|
|
||||||
type: String!
|
|
||||||
lat: Float
|
|
||||||
lng: Float
|
|
||||||
parent: Location @cypher(statement: "MATCH (this)-[:IS_IN]->(l:Location) RETURN l")
|
|
||||||
}
|
|
||||||
|
|
||||||
type User {
|
|
||||||
id: ID!
|
|
||||||
actorId: String
|
|
||||||
name: String
|
|
||||||
email: String!
|
|
||||||
slug: String
|
|
||||||
password: String!
|
|
||||||
avatar: String
|
|
||||||
avatarUpload: Upload
|
|
||||||
deleted: Boolean
|
|
||||||
disabled: Boolean
|
|
||||||
disabledBy: User @relation(name: "DISABLED", direction: "IN")
|
|
||||||
role: UserGroupEnum
|
|
||||||
publicKey: String
|
|
||||||
privateKey: String
|
|
||||||
|
|
||||||
location: Location @cypher(statement: "MATCH (this)-[:IS_IN]->(l:Location) RETURN l")
|
|
||||||
locationName: String
|
|
||||||
about: String
|
|
||||||
socialMedia: [SocialMedia]! @relation(name: "OWNED", direction: "OUT")
|
|
||||||
|
|
||||||
createdAt: String
|
|
||||||
updatedAt: String
|
|
||||||
|
|
||||||
notifications(read: Boolean): [Notification]! @relation(name: "NOTIFIED", direction: "IN")
|
|
||||||
|
|
||||||
friends: [User]! @relation(name: "FRIENDS", direction: "BOTH")
|
|
||||||
friendsCount: Int! @cypher(statement: "MATCH (this)<-[:FRIENDS]->(r:User) RETURN COUNT(DISTINCT r)")
|
|
||||||
|
|
||||||
following: [User]! @relation(name: "FOLLOWS", direction: "OUT")
|
|
||||||
followingCount: Int! @cypher(statement: "MATCH (this)-[:FOLLOWS]->(r:User) RETURN COUNT(DISTINCT r)")
|
|
||||||
|
|
||||||
followedBy: [User]! @relation(name: "FOLLOWS", direction: "IN")
|
|
||||||
followedByCount: Int! @cypher(statement: "MATCH (this)<-[:FOLLOWS]-(r:User) RETURN COUNT(DISTINCT r)")
|
|
||||||
|
|
||||||
# Is the currently logged in user following that user?
|
|
||||||
followedByCurrentUser: Boolean! @cypher(
|
|
||||||
statement: """
|
|
||||||
MATCH (this)<-[:FOLLOWS]-(u:User {id: $cypherParams.currentUserId})
|
|
||||||
RETURN COUNT(u) >= 1
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
|
|
||||||
#contributions: [WrittenPost]!
|
|
||||||
#contributions2(first: Int = 10, offset: Int = 0): [WrittenPost2]!
|
|
||||||
# @cypher(
|
|
||||||
# statement: "MATCH (this)-[w:WROTE]->(p:Post) RETURN p as Post, w.timestamp as timestamp"
|
|
||||||
# )
|
|
||||||
contributions: [Post]! @relation(name: "WROTE", direction: "OUT")
|
|
||||||
contributionsCount: Int! @cypher(
|
|
||||||
statement: """
|
|
||||||
MATCH (this)-[:WROTE]->(r:Post)
|
|
||||||
WHERE (NOT exists(r.deleted) OR r.deleted = false)
|
|
||||||
AND (NOT exists(r.disabled) OR r.disabled = false)
|
|
||||||
RETURN COUNT(r)
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
|
|
||||||
comments: [Comment]! @relation(name: "WROTE", direction: "OUT")
|
|
||||||
commentsCount: Int! @cypher(statement: "MATCH (this)-[:WROTE]->(r:Comment) WHERE NOT r.deleted = true AND NOT r.disabled = true RETURN COUNT(r)")
|
|
||||||
|
|
||||||
shouted: [Post]! @relation(name: "SHOUTED", direction: "OUT")
|
|
||||||
shoutedCount: Int! @cypher(statement: "MATCH (this)-[:SHOUTED]->(r:Post) WHERE NOT r.deleted = true AND NOT r.disabled = true RETURN COUNT(DISTINCT r)")
|
|
||||||
|
|
||||||
organizationsCreated: [Organization] @relation(name: "CREATED_ORGA", direction: "OUT")
|
|
||||||
organizationsOwned: [Organization] @relation(name: "OWNING_ORGA", direction: "OUT")
|
|
||||||
|
|
||||||
blacklisted: [User]! @relation(name: "BLACKLISTED", direction: "OUT")
|
|
||||||
|
|
||||||
categories: [Category]! @relation(name: "CATEGORIZED", direction: "OUT")
|
|
||||||
|
|
||||||
badges: [Badge]! @relation(name: "REWARDED", direction: "IN")
|
|
||||||
badgesCount: Int! @cypher(statement: "MATCH (this)<-[:REWARDED]-(r:Badge) RETURN COUNT(r)")
|
|
||||||
}
|
|
||||||
|
|
||||||
type Post {
|
|
||||||
id: ID!
|
|
||||||
activityId: String
|
|
||||||
objectId: String
|
|
||||||
author: User @relation(name: "WROTE", direction: "IN")
|
|
||||||
title: String!
|
|
||||||
slug: String
|
|
||||||
content: String!
|
|
||||||
contentExcerpt: String
|
|
||||||
image: String
|
|
||||||
imageUpload: Upload
|
|
||||||
visibility: VisibilityEnum
|
|
||||||
deleted: Boolean
|
|
||||||
disabled: Boolean
|
|
||||||
disabledBy: User @relation(name: "DISABLED", direction: "IN")
|
|
||||||
createdAt: String
|
|
||||||
updatedAt: String
|
|
||||||
|
|
||||||
relatedContributions: [Post]! @cypher(
|
|
||||||
statement: """
|
|
||||||
MATCH (this)-[:TAGGED|CATEGORIZED]->(categoryOrTag)<-[:TAGGED|CATEGORIZED]-(post:Post)
|
|
||||||
RETURN DISTINCT post
|
|
||||||
LIMIT 10
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
|
|
||||||
tags: [Tag]! @relation(name: "TAGGED", direction: "OUT")
|
|
||||||
categories: [Category]! @relation(name: "CATEGORIZED", direction: "OUT")
|
|
||||||
|
|
||||||
comments: [Comment]! @relation(name: "COMMENTS", direction: "IN")
|
|
||||||
commentsCount: Int! @cypher(statement: "MATCH (this)<-[:COMMENTS]-(r:Comment) WHERE NOT r.deleted = true AND NOT r.disabled = true RETURN COUNT(r)")
|
|
||||||
|
|
||||||
shoutedBy: [User]! @relation(name: "SHOUTED", direction: "IN")
|
|
||||||
shoutedCount: Int! @cypher(statement: "MATCH (this)<-[:SHOUTED]-(r:User) WHERE NOT r.deleted = true AND NOT r.disabled = true RETURN COUNT(DISTINCT r)")
|
|
||||||
|
|
||||||
# Has the currently logged in user shouted that post?
|
|
||||||
shoutedByCurrentUser: Boolean! @cypher(
|
|
||||||
statement: """
|
|
||||||
MATCH (this)<-[:SHOUTED]-(u:User {id: $cypherParams.currentUserId})
|
|
||||||
RETURN COUNT(u) >= 1
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
type Comment {
|
|
||||||
id: ID!
|
|
||||||
activityId: String
|
|
||||||
postId: ID
|
|
||||||
author: User @relation(name: "WROTE", direction: "IN")
|
|
||||||
content: String!
|
|
||||||
contentExcerpt: String
|
|
||||||
post: Post @relation(name: "COMMENTS", direction: "OUT")
|
|
||||||
createdAt: String
|
|
||||||
updatedAt: String
|
|
||||||
deleted: Boolean
|
|
||||||
disabled: Boolean
|
|
||||||
disabledBy: User @relation(name: "DISABLED", direction: "IN")
|
|
||||||
}
|
|
||||||
|
|
||||||
type Report {
|
|
||||||
id: ID!
|
|
||||||
submitter: User @relation(name: "REPORTED", direction: "IN")
|
|
||||||
description: String
|
|
||||||
type: String! @cypher(statement: "MATCH (resource)<-[:REPORTED]-(this) RETURN labels(resource)[0]")
|
|
||||||
createdAt: String
|
|
||||||
comment: Comment @relation(name: "REPORTED", direction: "OUT")
|
|
||||||
post: Post @relation(name: "REPORTED", direction: "OUT")
|
|
||||||
user: User @relation(name: "REPORTED", direction: "OUT")
|
|
||||||
}
|
|
||||||
|
|
||||||
type Category {
|
|
||||||
id: ID!
|
|
||||||
name: String!
|
|
||||||
slug: String
|
|
||||||
icon: String!
|
|
||||||
posts: [Post]! @relation(name: "CATEGORIZED", direction: "IN")
|
|
||||||
postCount: Int! @cypher(statement: "MATCH (this)<-[:CATEGORIZED]-(r:Post) RETURN COUNT(r)")
|
|
||||||
}
|
|
||||||
|
|
||||||
type Badge {
|
|
||||||
id: ID!
|
|
||||||
key: String!
|
|
||||||
type: BadgeTypeEnum!
|
|
||||||
status: BadgeStatusEnum!
|
|
||||||
icon: String!
|
|
||||||
|
|
||||||
rewarded: [User]! @relation(name: "REWARDED", direction: "OUT")
|
|
||||||
}
|
|
||||||
|
|
||||||
enum BadgeTypeEnum {
|
|
||||||
role
|
|
||||||
crowdfunding
|
|
||||||
}
|
|
||||||
enum BadgeStatusEnum {
|
|
||||||
permanent
|
|
||||||
temporary
|
|
||||||
}
|
|
||||||
enum ShoutTypeEnum {
|
|
||||||
Post
|
|
||||||
Organization
|
|
||||||
Project
|
|
||||||
}
|
|
||||||
enum FollowTypeEnum {
|
|
||||||
User
|
|
||||||
Organization
|
|
||||||
Project
|
|
||||||
}
|
|
||||||
|
|
||||||
type Reward {
|
|
||||||
id: ID!
|
|
||||||
user: User @relation(name: "REWARDED", direction: "IN")
|
|
||||||
rewarderId: ID
|
|
||||||
createdAt: String
|
|
||||||
badge: Badge @relation(name: "REWARDED", direction: "OUT")
|
|
||||||
}
|
|
||||||
|
|
||||||
type Organization {
|
|
||||||
id: ID!
|
|
||||||
createdBy: User @relation(name: "CREATED_ORGA", direction: "IN")
|
|
||||||
ownedBy: [User] @relation(name: "OWNING_ORGA", direction: "IN")
|
|
||||||
name: String!
|
|
||||||
slug: String
|
|
||||||
description: String!
|
|
||||||
descriptionExcerpt: String
|
|
||||||
deleted: Boolean
|
|
||||||
disabled: Boolean
|
|
||||||
|
|
||||||
tags: [Tag]! @relation(name: "TAGGED", direction: "OUT")
|
|
||||||
categories: [Category]! @relation(name: "CATEGORIZED", direction: "OUT")
|
|
||||||
}
|
|
||||||
|
|
||||||
type Tag {
|
|
||||||
id: ID!
|
|
||||||
name: String!
|
|
||||||
taggedPosts: [Post]! @relation(name: "TAGGED", direction: "IN")
|
|
||||||
taggedOrganizations: [Organization]! @relation(name: "TAGGED", direction: "IN")
|
|
||||||
taggedCount: Int! @cypher(statement: "MATCH (this)<-[:TAGGED]-(p) RETURN COUNT(DISTINCT p)")
|
|
||||||
taggedCountUnique: Int! @cypher(statement: "MATCH (this)<-[:TAGGED]-(p)<-[:WROTE]-(u:User) RETURN COUNT(DISTINCT u)")
|
|
||||||
deleted: Boolean
|
|
||||||
disabled: Boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
type SharedInboxEndpoint {
|
|
||||||
id: ID!
|
|
||||||
uri: String
|
|
||||||
}
|
|
||||||
|
|
||||||
type SocialMedia {
|
|
||||||
id: ID!
|
|
||||||
url: String
|
|
||||||
ownedBy: [User]! @relation(name: "OWNED", direction: "IN")
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -1,6 +1,5 @@
|
|||||||
type Badge {
|
type Badge {
|
||||||
id: ID!
|
id: ID!
|
||||||
key: String!
|
|
||||||
type: BadgeType!
|
type: BadgeType!
|
||||||
status: BadgeStatus!
|
status: BadgeStatus!
|
||||||
icon: String!
|
icon: String!
|
||||||
@ -10,4 +9,23 @@ type Badge {
|
|||||||
updatedAt: String
|
updatedAt: String
|
||||||
|
|
||||||
rewarded: [User]! @relation(name: "REWARDED", direction: "OUT")
|
rewarded: [User]! @relation(name: "REWARDED", direction: "OUT")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum BadgeStatus {
|
||||||
|
permanent
|
||||||
|
temporary
|
||||||
|
}
|
||||||
|
|
||||||
|
enum BadgeType {
|
||||||
|
role
|
||||||
|
crowdfunding
|
||||||
|
}
|
||||||
|
|
||||||
|
type Query {
|
||||||
|
Badge: [Badge]
|
||||||
|
}
|
||||||
|
|
||||||
|
type Mutation {
|
||||||
|
reward(badgeKey: ID!, userId: ID!): User
|
||||||
|
unreward(badgeKey: ID!, userId: ID!): User
|
||||||
|
}
|
||||||
|
|||||||
@ -1,28 +1,15 @@
|
|||||||
import uuid from 'uuid/v4'
|
export default function create() {
|
||||||
|
|
||||||
export default function(params) {
|
|
||||||
const {
|
|
||||||
id = uuid(),
|
|
||||||
key = '',
|
|
||||||
type = 'crowdfunding',
|
|
||||||
status = 'permanent',
|
|
||||||
icon = '/img/badges/indiegogo_en_panda.svg',
|
|
||||||
} = params
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
mutation: `
|
factory: async ({ args, neodeInstance }) => {
|
||||||
mutation(
|
const defaults = {
|
||||||
$id: ID
|
type: 'crowdfunding',
|
||||||
$key: String!
|
status: 'permanent',
|
||||||
$type: BadgeType!
|
|
||||||
$status: BadgeStatus!
|
|
||||||
$icon: String!
|
|
||||||
) {
|
|
||||||
CreateBadge(id: $id, key: $key, type: $type, status: $status, icon: $icon) {
|
|
||||||
id
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
`,
|
args = {
|
||||||
variables: { id, key, type, status, icon },
|
...defaults,
|
||||||
|
...args,
|
||||||
|
}
|
||||||
|
return neodeInstance.create('Badge', args)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -73,6 +73,7 @@ export default function Factory(options = {}) {
|
|||||||
const { factory, mutation, variables } = this.factories[node](args)
|
const { factory, mutation, variables } = this.factories[node](args)
|
||||||
if (factory) {
|
if (factory) {
|
||||||
this.lastResponse = await factory({ args, neodeInstance })
|
this.lastResponse = await factory({ args, neodeInstance })
|
||||||
|
return this.lastResponse
|
||||||
} else {
|
} else {
|
||||||
this.lastResponse = await this.graphQLClient.request(mutation, variables)
|
this.lastResponse = await this.graphQLClient.request(mutation, variables)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import uuid from 'uuid/v4'
|
|||||||
import encryptPassword from '../../helpers/encryptPassword'
|
import encryptPassword from '../../helpers/encryptPassword'
|
||||||
import slugify from 'slug'
|
import slugify from 'slug'
|
||||||
|
|
||||||
export default function create(params) {
|
export default function create() {
|
||||||
return {
|
return {
|
||||||
factory: async ({ args, neodeInstance }) => {
|
factory: async ({ args, neodeInstance }) => {
|
||||||
const defaults = {
|
const defaults = {
|
||||||
@ -21,8 +21,7 @@ export default function create(params) {
|
|||||||
...args,
|
...args,
|
||||||
}
|
}
|
||||||
args = await encryptPassword(args)
|
args = await encryptPassword(args)
|
||||||
const user = await neodeInstance.create('User', args)
|
return neodeInstance.create('User', args)
|
||||||
return user.toJson()
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,52 +5,42 @@ import Factory from './factories'
|
|||||||
;(async function() {
|
;(async function() {
|
||||||
try {
|
try {
|
||||||
const f = Factory()
|
const f = Factory()
|
||||||
await Promise.all([
|
const [racoon, rabbit, wolf, bear, turtle, rhino] = await Promise.all([
|
||||||
f.create('Badge', {
|
f.create('Badge', {
|
||||||
id: 'b1',
|
id: 'indiegogo_en_racoon',
|
||||||
key: 'indiegogo_en_racoon',
|
|
||||||
type: 'crowdfunding',
|
|
||||||
status: 'permanent',
|
|
||||||
icon: '/img/badges/indiegogo_en_racoon.svg',
|
icon: '/img/badges/indiegogo_en_racoon.svg',
|
||||||
}),
|
}),
|
||||||
f.create('Badge', {
|
f.create('Badge', {
|
||||||
id: 'b2',
|
id: 'indiegogo_en_rabbit',
|
||||||
key: 'indiegogo_en_rabbit',
|
|
||||||
type: 'crowdfunding',
|
|
||||||
status: 'permanent',
|
|
||||||
icon: '/img/badges/indiegogo_en_rabbit.svg',
|
icon: '/img/badges/indiegogo_en_rabbit.svg',
|
||||||
}),
|
}),
|
||||||
f.create('Badge', {
|
f.create('Badge', {
|
||||||
id: 'b3',
|
id: 'indiegogo_en_wolf',
|
||||||
key: 'indiegogo_en_wolf',
|
|
||||||
type: 'crowdfunding',
|
|
||||||
status: 'permanent',
|
|
||||||
icon: '/img/badges/indiegogo_en_wolf.svg',
|
icon: '/img/badges/indiegogo_en_wolf.svg',
|
||||||
}),
|
}),
|
||||||
f.create('Badge', {
|
f.create('Badge', {
|
||||||
id: 'b4',
|
id: 'indiegogo_en_bear',
|
||||||
key: 'indiegogo_en_bear',
|
|
||||||
type: 'crowdfunding',
|
|
||||||
status: 'permanent',
|
|
||||||
icon: '/img/badges/indiegogo_en_bear.svg',
|
icon: '/img/badges/indiegogo_en_bear.svg',
|
||||||
}),
|
}),
|
||||||
f.create('Badge', {
|
f.create('Badge', {
|
||||||
id: 'b5',
|
id: 'indiegogo_en_turtle',
|
||||||
key: 'indiegogo_en_turtle',
|
|
||||||
type: 'crowdfunding',
|
|
||||||
status: 'permanent',
|
|
||||||
icon: '/img/badges/indiegogo_en_turtle.svg',
|
icon: '/img/badges/indiegogo_en_turtle.svg',
|
||||||
}),
|
}),
|
||||||
f.create('Badge', {
|
f.create('Badge', {
|
||||||
id: 'b6',
|
id: 'indiegogo_en_rhino',
|
||||||
key: 'indiegogo_en_rhino',
|
|
||||||
type: 'crowdfunding',
|
|
||||||
status: 'permanent',
|
|
||||||
icon: '/img/badges/indiegogo_en_rhino.svg',
|
icon: '/img/badges/indiegogo_en_rhino.svg',
|
||||||
}),
|
}),
|
||||||
])
|
])
|
||||||
|
|
||||||
await Promise.all([
|
const [
|
||||||
|
peterLustig,
|
||||||
|
bobDerBaumeister,
|
||||||
|
jennyRostock,
|
||||||
|
tick, // eslint-disable-line no-unused-vars
|
||||||
|
trick, // eslint-disable-line no-unused-vars
|
||||||
|
track, // eslint-disable-line no-unused-vars
|
||||||
|
dagobert,
|
||||||
|
] = await Promise.all([
|
||||||
f.create('User', {
|
f.create('User', {
|
||||||
id: 'u1',
|
id: 'u1',
|
||||||
name: 'Peter Lustig',
|
name: 'Peter Lustig',
|
||||||
@ -123,30 +113,16 @@ import Factory from './factories'
|
|||||||
])
|
])
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
f.relate('User', 'Badges', {
|
peterLustig.relateTo(racoon, 'rewarded'),
|
||||||
from: 'b6',
|
peterLustig.relateTo(rhino, 'rewarded'),
|
||||||
to: 'u1',
|
peterLustig.relateTo(wolf, 'rewarded'),
|
||||||
}),
|
bobDerBaumeister.relateTo(racoon, 'rewarded'),
|
||||||
f.relate('User', 'Badges', {
|
bobDerBaumeister.relateTo(turtle, 'rewarded'),
|
||||||
from: 'b5',
|
jennyRostock.relateTo(bear, 'rewarded'),
|
||||||
to: 'u2',
|
dagobert.relateTo(rabbit, 'rewarded'),
|
||||||
}),
|
])
|
||||||
f.relate('User', 'Badges', {
|
|
||||||
from: 'b4',
|
await Promise.all([
|
||||||
to: 'u3',
|
|
||||||
}),
|
|
||||||
f.relate('User', 'Badges', {
|
|
||||||
from: 'b3',
|
|
||||||
to: 'u4',
|
|
||||||
}),
|
|
||||||
f.relate('User', 'Badges', {
|
|
||||||
from: 'b2',
|
|
||||||
to: 'u5',
|
|
||||||
}),
|
|
||||||
f.relate('User', 'Badges', {
|
|
||||||
from: 'b1',
|
|
||||||
to: 'u6',
|
|
||||||
}),
|
|
||||||
f.relate('User', 'Friends', {
|
f.relate('User', 'Friends', {
|
||||||
from: 'u1',
|
from: 'u1',
|
||||||
to: 'u2',
|
to: 'u2',
|
||||||
|
|||||||
@ -9,11 +9,6 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
apollo-env "0.5.1"
|
apollo-env "0.5.1"
|
||||||
|
|
||||||
"@apollographql/graphql-playground-html@1.6.20":
|
|
||||||
version "1.6.20"
|
|
||||||
resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.20.tgz#bf9f2acdf319c0959fad8ec1239741dd2ead4e8d"
|
|
||||||
integrity sha512-3LWZa80HcP70Pl+H4KhLDJ7S0px+9/c8GTXdl6SpunRecUaB27g/oOQnAjNHLHdbWuGE0uyqcuGiTfbKB3ilaQ==
|
|
||||||
|
|
||||||
"@apollographql/graphql-playground-html@1.6.24":
|
"@apollographql/graphql-playground-html@1.6.24":
|
||||||
version "1.6.24"
|
version "1.6.24"
|
||||||
resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.24.tgz#3ce939cb127fb8aaa3ffc1e90dff9b8af9f2e3dc"
|
resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.24.tgz#3ce939cb127fb8aaa3ffc1e90dff9b8af9f2e3dc"
|
||||||
@ -1348,14 +1343,6 @@ anymatch@^2.0.0:
|
|||||||
micromatch "^3.1.4"
|
micromatch "^3.1.4"
|
||||||
normalize-path "^2.1.1"
|
normalize-path "^2.1.1"
|
||||||
|
|
||||||
apollo-cache-control@0.7.4:
|
|
||||||
version "0.7.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.7.4.tgz#0cb5c7be0e0dd0c44b1257144cd7f9f2a3c374e6"
|
|
||||||
integrity sha512-TVACHwcEF4wfHo5H9FLnoNjo0SLDo2jPW+bXs9aw0Y4Z2UisskSAPnIYOqUPnU8SoeNvs7zWgbLizq11SRTJtg==
|
|
||||||
dependencies:
|
|
||||||
apollo-server-env "2.4.0"
|
|
||||||
graphql-extensions "0.7.4"
|
|
||||||
|
|
||||||
apollo-cache-control@0.7.5:
|
apollo-cache-control@0.7.5:
|
||||||
version "0.7.5"
|
version "0.7.5"
|
||||||
resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.7.5.tgz#5d8b949bd9b4f03ca32c7d7e429f509c6881eefc"
|
resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.7.5.tgz#5d8b949bd9b4f03ca32c7d7e429f509c6881eefc"
|
||||||
@ -1419,18 +1406,6 @@ apollo-engine-reporting-protobuf@0.3.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
protobufjs "^6.8.6"
|
protobufjs "^6.8.6"
|
||||||
|
|
||||||
apollo-engine-reporting@1.3.5:
|
|
||||||
version "1.3.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.3.5.tgz#075424d39dfe77a20f96e8e33b7ae52d58c38e1e"
|
|
||||||
integrity sha512-pSwjPgXK/elFsR22LXALtT3jI4fpEpeTNTHgNwLVLohaolusMYgBc/9FnVyFWFfMFS9k+3RmfeQdHhZ6T7WKFQ==
|
|
||||||
dependencies:
|
|
||||||
apollo-engine-reporting-protobuf "0.3.1"
|
|
||||||
apollo-graphql "^0.3.3"
|
|
||||||
apollo-server-core "2.6.7"
|
|
||||||
apollo-server-env "2.4.0"
|
|
||||||
async-retry "^1.2.1"
|
|
||||||
graphql-extensions "0.7.6"
|
|
||||||
|
|
||||||
apollo-engine-reporting@1.3.6:
|
apollo-engine-reporting@1.3.6:
|
||||||
version "1.3.6"
|
version "1.3.6"
|
||||||
resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.3.6.tgz#579ba2da85ff848bd92be1b0f1ad61f0c57e3585"
|
resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.3.6.tgz#579ba2da85ff848bd92be1b0f1ad61f0c57e3585"
|
||||||
@ -1511,58 +1486,6 @@ apollo-server-caching@0.4.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
lru-cache "^5.0.0"
|
lru-cache "^5.0.0"
|
||||||
|
|
||||||
apollo-server-core@2.6.7:
|
|
||||||
version "2.6.7"
|
|
||||||
resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.6.7.tgz#85b0310f40cfec43a702569c73af16d88776a6f0"
|
|
||||||
integrity sha512-HfOGLvEwPgDWTvd3ZKRPEkEnICKb7xadn1Mci4+auMTsL/NVkfpjPa8cdzubi/kS2/MvioIn7Bg74gmiSLghGQ==
|
|
||||||
dependencies:
|
|
||||||
"@apollographql/apollo-tools" "^0.3.6"
|
|
||||||
"@apollographql/graphql-playground-html" "1.6.20"
|
|
||||||
"@types/ws" "^6.0.0"
|
|
||||||
apollo-cache-control "0.7.4"
|
|
||||||
apollo-datasource "0.5.0"
|
|
||||||
apollo-engine-reporting "1.3.5"
|
|
||||||
apollo-server-caching "0.4.0"
|
|
||||||
apollo-server-env "2.4.0"
|
|
||||||
apollo-server-errors "2.3.0"
|
|
||||||
apollo-server-plugin-base "0.5.6"
|
|
||||||
apollo-tracing "0.7.3"
|
|
||||||
fast-json-stable-stringify "^2.0.0"
|
|
||||||
graphql-extensions "0.7.6"
|
|
||||||
graphql-subscriptions "^1.0.0"
|
|
||||||
graphql-tag "^2.9.2"
|
|
||||||
graphql-tools "^4.0.0"
|
|
||||||
graphql-upload "^8.0.2"
|
|
||||||
sha.js "^2.4.11"
|
|
||||||
subscriptions-transport-ws "^0.9.11"
|
|
||||||
ws "^6.0.0"
|
|
||||||
|
|
||||||
apollo-server-core@2.6.8:
|
|
||||||
version "2.6.8"
|
|
||||||
resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.6.8.tgz#c8758b5f26b5f3b9fef51b911265b80a9ce5251d"
|
|
||||||
integrity sha512-Jxw+6R/2I2LiZ6kjRFTzPpdjw7HfuVLfNU+svgNlxioLducxBH/wqUs3qYTf4eVUUtWy+nSS/BUf/Ullo+Ur0Q==
|
|
||||||
dependencies:
|
|
||||||
"@apollographql/apollo-tools" "^0.3.6"
|
|
||||||
"@apollographql/graphql-playground-html" "1.6.20"
|
|
||||||
"@types/ws" "^6.0.0"
|
|
||||||
apollo-cache-control "0.7.4"
|
|
||||||
apollo-datasource "0.5.0"
|
|
||||||
apollo-engine-reporting "1.3.5"
|
|
||||||
apollo-server-caching "0.4.0"
|
|
||||||
apollo-server-env "2.4.0"
|
|
||||||
apollo-server-errors "2.3.0"
|
|
||||||
apollo-server-plugin-base "0.5.7"
|
|
||||||
apollo-tracing "0.7.3"
|
|
||||||
fast-json-stable-stringify "^2.0.0"
|
|
||||||
graphql-extensions "0.7.6"
|
|
||||||
graphql-subscriptions "^1.0.0"
|
|
||||||
graphql-tag "^2.9.2"
|
|
||||||
graphql-tools "^4.0.0"
|
|
||||||
graphql-upload "^8.0.2"
|
|
||||||
sha.js "^2.4.11"
|
|
||||||
subscriptions-transport-ws "^0.9.11"
|
|
||||||
ws "^6.0.0"
|
|
||||||
|
|
||||||
apollo-server-core@2.6.9:
|
apollo-server-core@2.6.9:
|
||||||
version "2.6.9"
|
version "2.6.9"
|
||||||
resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.6.9.tgz#75542ad206782e5c31a023b54962e9fdc6404a91"
|
resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.6.9.tgz#75542ad206782e5c31a023b54962e9fdc6404a91"
|
||||||
@ -1606,28 +1529,23 @@ apollo-server-env@2.4.0:
|
|||||||
node-fetch "^2.1.2"
|
node-fetch "^2.1.2"
|
||||||
util.promisify "^1.0.0"
|
util.promisify "^1.0.0"
|
||||||
|
|
||||||
apollo-server-errors@2.3.0:
|
|
||||||
version "2.3.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.3.0.tgz#700622b66a16dffcad3b017e4796749814edc061"
|
|
||||||
integrity sha512-rUvzwMo2ZQgzzPh2kcJyfbRSfVKRMhfIlhY7BzUfM4x6ZT0aijlgsf714Ll3Mbf5Fxii32kD0A/DmKsTecpccw==
|
|
||||||
|
|
||||||
apollo-server-errors@2.3.1:
|
apollo-server-errors@2.3.1:
|
||||||
version "2.3.1"
|
version "2.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.3.1.tgz#033cf331463ebb99a563f8354180b41ac6714eb6"
|
resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.3.1.tgz#033cf331463ebb99a563f8354180b41ac6714eb6"
|
||||||
integrity sha512-errZvnh0vUQChecT7M4A/h94dnBSRL213dNxpM5ueMypaLYgnp4hiCTWIEaooo9E4yMGd1qA6WaNbLDG2+bjcg==
|
integrity sha512-errZvnh0vUQChecT7M4A/h94dnBSRL213dNxpM5ueMypaLYgnp4hiCTWIEaooo9E4yMGd1qA6WaNbLDG2+bjcg==
|
||||||
|
|
||||||
apollo-server-express@2.6.8:
|
apollo-server-express@2.6.9:
|
||||||
version "2.6.8"
|
version "2.6.9"
|
||||||
resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.6.8.tgz#9f3e29f7087af669f05d75dfd335b4a9383ba48e"
|
resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.6.9.tgz#176dab7f2cd5a99655c8eb382ad9b10797422a7b"
|
||||||
integrity sha512-LQzVHknQDkHWffc2qK9dr/qNxQ/WecSKiye5/w10tXrOy3aruTFe67ysG/vMnFZ/puroqiZ2njHzhHZztqQ4sA==
|
integrity sha512-iTkdIdX7m9EAlmL/ZPkKR+x/xuFk1HYZWuJIJG57hHUhcOxj50u7F1E5+5fDwl5RFIdepQ61azF31hhNZuNi4g==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@apollographql/graphql-playground-html" "1.6.20"
|
"@apollographql/graphql-playground-html" "1.6.24"
|
||||||
"@types/accepts" "^1.3.5"
|
"@types/accepts" "^1.3.5"
|
||||||
"@types/body-parser" "1.17.0"
|
"@types/body-parser" "1.17.0"
|
||||||
"@types/cors" "^2.8.4"
|
"@types/cors" "^2.8.4"
|
||||||
"@types/express" "4.17.0"
|
"@types/express" "4.17.0"
|
||||||
accepts "^1.3.5"
|
accepts "^1.3.5"
|
||||||
apollo-server-core "2.6.8"
|
apollo-server-core "2.6.9"
|
||||||
body-parser "^1.18.3"
|
body-parser "^1.18.3"
|
||||||
cors "^2.8.4"
|
cors "^2.8.4"
|
||||||
graphql-subscriptions "^1.0.0"
|
graphql-subscriptions "^1.0.0"
|
||||||
@ -1655,16 +1573,6 @@ apollo-server-module-graphiql@^1.3.4, apollo-server-module-graphiql@^1.4.0:
|
|||||||
resolved "https://registry.yarnpkg.com/apollo-server-module-graphiql/-/apollo-server-module-graphiql-1.4.0.tgz#c559efa285578820709f1769bb85d3b3eed3d8ec"
|
resolved "https://registry.yarnpkg.com/apollo-server-module-graphiql/-/apollo-server-module-graphiql-1.4.0.tgz#c559efa285578820709f1769bb85d3b3eed3d8ec"
|
||||||
integrity sha512-GmkOcb5he2x5gat+TuiTvabnBf1m4jzdecal3XbXBh/Jg+kx4hcvO3TTDFQ9CuTprtzdcVyA11iqG7iOMOt7vA==
|
integrity sha512-GmkOcb5he2x5gat+TuiTvabnBf1m4jzdecal3XbXBh/Jg+kx4hcvO3TTDFQ9CuTprtzdcVyA11iqG7iOMOt7vA==
|
||||||
|
|
||||||
apollo-server-plugin-base@0.5.6:
|
|
||||||
version "0.5.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.5.6.tgz#3a7128437a0f845e7d873fa43ef091ff7bf27975"
|
|
||||||
integrity sha512-wJvcPqfm/kiBwY5JZT85t2A4pcHv24xdQIpWMNt1zsnx77lIZqJmhsc22eSUSrlnYqUMXC4XMVgSUfAO4oI9wg==
|
|
||||||
|
|
||||||
apollo-server-plugin-base@0.5.7:
|
|
||||||
version "0.5.7"
|
|
||||||
resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.5.7.tgz#267faeb5c2de7fa8d3be469cb99f82f601be7aed"
|
|
||||||
integrity sha512-HeEwEZ92c2XYRV+0CFLbstW3vUJ4idCxR9E9Q3wwvhXrq8gaGzqyDoC8EzAzRxCJUKcEn7xQOpT/AUTC/KtkRA==
|
|
||||||
|
|
||||||
apollo-server-plugin-base@0.5.8:
|
apollo-server-plugin-base@0.5.8:
|
||||||
version "0.5.8"
|
version "0.5.8"
|
||||||
resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.5.8.tgz#77b4127aff4e3514a9d49e3cc61256aee4d9422e"
|
resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.5.8.tgz#77b4127aff4e3514a9d49e3cc61256aee4d9422e"
|
||||||
@ -1677,25 +1585,17 @@ apollo-server-testing@~2.6.9:
|
|||||||
dependencies:
|
dependencies:
|
||||||
apollo-server-core "2.6.9"
|
apollo-server-core "2.6.9"
|
||||||
|
|
||||||
apollo-server@~2.6.8:
|
apollo-server@~2.6.9:
|
||||||
version "2.6.8"
|
version "2.6.9"
|
||||||
resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.6.8.tgz#5f3cf5cf4f2feccbded0cb03fa37dcd8260e5c6a"
|
resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.6.9.tgz#10e70488b35bf5171612dfd3f030e4ef94c75295"
|
||||||
integrity sha512-BxwaGxnD3GPuZAAqsexVHFvDlF/s2X8pILgYQ4x+VhUkMeQ12DHQtKPuxn2v2GYwH0U/GDXNohkgwxF/5eTDsQ==
|
integrity sha512-thZxUHVM1CLl3503gMCVirxN9J/33s5C1R+hHMEfLaUSoDlXSMA81Y9LCOi9+6d0C9l5DwiZCFXeZI/fKic2RA==
|
||||||
dependencies:
|
dependencies:
|
||||||
apollo-server-core "2.6.8"
|
apollo-server-core "2.6.9"
|
||||||
apollo-server-express "2.6.8"
|
apollo-server-express "2.6.9"
|
||||||
express "^4.0.0"
|
express "^4.0.0"
|
||||||
graphql-subscriptions "^1.0.0"
|
graphql-subscriptions "^1.0.0"
|
||||||
graphql-tools "^4.0.0"
|
graphql-tools "^4.0.0"
|
||||||
|
|
||||||
apollo-tracing@0.7.3:
|
|
||||||
version "0.7.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.7.3.tgz#8533e3e2dca2d5a25e8439ce498ea33ff4d159ee"
|
|
||||||
integrity sha512-H6fSC+awQGnfDyYdGIB0UQUhcUC3n5Vy+ujacJ0bY6R+vwWeZOQvu7wRHNjk/rbOSTLCo9A0OcVX7huRyu9SZg==
|
|
||||||
dependencies:
|
|
||||||
apollo-server-env "2.4.0"
|
|
||||||
graphql-extensions "0.7.4"
|
|
||||||
|
|
||||||
apollo-tracing@0.7.4:
|
apollo-tracing@0.7.4:
|
||||||
version "0.7.4"
|
version "0.7.4"
|
||||||
resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.7.4.tgz#f24d1065100b6d8bf581202859ea0e85ba7bf30d"
|
resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.7.4.tgz#f24d1065100b6d8bf581202859ea0e85ba7bf30d"
|
||||||
@ -3891,20 +3791,6 @@ graphql-deduplicator@^2.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/graphql-deduplicator/-/graphql-deduplicator-2.0.2.tgz#d8608161cf6be97725e178df0c41f6a1f9f778f3"
|
resolved "https://registry.yarnpkg.com/graphql-deduplicator/-/graphql-deduplicator-2.0.2.tgz#d8608161cf6be97725e178df0c41f6a1f9f778f3"
|
||||||
integrity sha512-0CGmTmQh4UvJfsaTPppJAcHwHln8Ayat7yXXxdnuWT+Mb1dBzkbErabCWzjXyKh/RefqlGTTA7EQOZHofMaKJA==
|
integrity sha512-0CGmTmQh4UvJfsaTPppJAcHwHln8Ayat7yXXxdnuWT+Mb1dBzkbErabCWzjXyKh/RefqlGTTA7EQOZHofMaKJA==
|
||||||
|
|
||||||
graphql-extensions@0.7.4:
|
|
||||||
version "0.7.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.7.4.tgz#78327712822281d5778b9210a55dc59c93a9c184"
|
|
||||||
integrity sha512-Ly+DiTDU+UtlfPGQkqmBX2SWMr9OT3JxMRwpB9K86rDNDBTJtG6AE2kliQKKE+hg1+945KAimO7Ep+YAvS7ywg==
|
|
||||||
dependencies:
|
|
||||||
"@apollographql/apollo-tools" "^0.3.6"
|
|
||||||
|
|
||||||
graphql-extensions@0.7.6:
|
|
||||||
version "0.7.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.7.6.tgz#80cdddf08b0af12525529d1922ee2ea0d0cc8ecf"
|
|
||||||
integrity sha512-RV00O3YFD1diehvdja180BlKOGWgeigr/8/Wzr6lXwLcFtk6FecQC/7nf6oW1qhuXczHyNjt/uCr0WWbWq6mYg==
|
|
||||||
dependencies:
|
|
||||||
"@apollographql/apollo-tools" "^0.3.6"
|
|
||||||
|
|
||||||
graphql-extensions@0.7.7:
|
graphql-extensions@0.7.7:
|
||||||
version "0.7.7"
|
version "0.7.7"
|
||||||
resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.7.7.tgz#19f4dea35391065de72b25def98f8396887bdf43"
|
resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.7.7.tgz#19f4dea35391065de72b25def98f8396887bdf43"
|
||||||
|
|||||||
@ -23,24 +23,27 @@ Cypress.Commands.add('factory', () => {
|
|||||||
Cypress.Commands.add(
|
Cypress.Commands.add(
|
||||||
'create',
|
'create',
|
||||||
{ prevSubject: true },
|
{ prevSubject: true },
|
||||||
(factory, node, properties) => {
|
async (factory, node, properties) => {
|
||||||
return factory.create(node, properties)
|
await factory.create(node, properties)
|
||||||
|
return factory
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
Cypress.Commands.add(
|
Cypress.Commands.add(
|
||||||
'relate',
|
'relate',
|
||||||
{ prevSubject: true },
|
{ prevSubject: true },
|
||||||
(factory, node, relationship, properties) => {
|
async (factory, node, relationship, properties) => {
|
||||||
return factory.relate(node, relationship, properties)
|
await factory.relate(node, relationship, properties)
|
||||||
|
return factory
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
Cypress.Commands.add(
|
Cypress.Commands.add(
|
||||||
'mutate',
|
'mutate',
|
||||||
{ prevSubject: true },
|
{ prevSubject: true },
|
||||||
(factory, mutation, variables) => {
|
async (factory, mutation, variables) => {
|
||||||
return factory.mutate(mutation, variables)
|
await factory.mutate(mutation, variables)
|
||||||
|
return factory
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -25,7 +25,7 @@
|
|||||||
[?] type: String, // in nitro this is a defined enum - seems good for now
|
[?] type: String, // in nitro this is a defined enum - seems good for now
|
||||||
[X] required: true
|
[X] required: true
|
||||||
},
|
},
|
||||||
[X] key: {
|
[X] id: {
|
||||||
[X] type: String,
|
[X] type: String,
|
||||||
[X] required: true
|
[X] required: true
|
||||||
},
|
},
|
||||||
@ -43,7 +43,7 @@
|
|||||||
CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as badge
|
CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as badge
|
||||||
MERGE(b:Badge {id: badge._id["$oid"]})
|
MERGE(b:Badge {id: badge._id["$oid"]})
|
||||||
ON CREATE SET
|
ON CREATE SET
|
||||||
b.key = badge.key,
|
b.id = badge.key,
|
||||||
b.type = badge.type,
|
b.type = badge.type,
|
||||||
b.icon = replace(badge.image.path, 'https://api-alpha.human-connection.org', ''),
|
b.icon = replace(badge.image.path, 'https://api-alpha.human-connection.org', ''),
|
||||||
b.status = badge.status,
|
b.status = badge.status,
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div :class="[badges.length === 2 && 'hc-badges-dual']" class="hc-badges">
|
<div :class="[badges.length === 2 && 'hc-badges-dual']" class="hc-badges">
|
||||||
<div v-for="badge in badges" :key="badge.key" class="hc-badge-container">
|
<div v-for="badge in badges" :key="badge.id" class="hc-badge-container">
|
||||||
<img :title="badge.key" :src="badge.icon | proxyApiUrl" class="hc-badge" />
|
<img :title="badge.key" :src="badge.icon | proxyApiUrl" class="hc-badge" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -47,7 +47,8 @@ export default {
|
|||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
Post(post) {
|
Post(post) {
|
||||||
this.comments = post[0].comments || []
|
const [first] = post
|
||||||
|
this.comments = (first && first.comments) || []
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
apollo: {
|
apollo: {
|
||||||
|
|||||||
@ -25,7 +25,6 @@ export default app => {
|
|||||||
}
|
}
|
||||||
badges {
|
badges {
|
||||||
id
|
id
|
||||||
key
|
|
||||||
icon
|
icon
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,7 +29,6 @@ export default i18n => {
|
|||||||
}
|
}
|
||||||
badges {
|
badges {
|
||||||
id
|
id
|
||||||
key
|
|
||||||
icon
|
icon
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,7 +30,6 @@ export default i18n => {
|
|||||||
}
|
}
|
||||||
badges {
|
badges {
|
||||||
id
|
id
|
||||||
key
|
|
||||||
icon
|
icon
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -61,7 +60,6 @@ export default i18n => {
|
|||||||
}
|
}
|
||||||
badges {
|
badges {
|
||||||
id
|
id
|
||||||
key
|
|
||||||
icon
|
icon
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,7 +19,6 @@ export default i18n => {
|
|||||||
createdAt
|
createdAt
|
||||||
badges {
|
badges {
|
||||||
id
|
id
|
||||||
key
|
|
||||||
icon
|
icon
|
||||||
}
|
}
|
||||||
badgesCount
|
badgesCount
|
||||||
@ -39,7 +38,6 @@ export default i18n => {
|
|||||||
commentsCount
|
commentsCount
|
||||||
badges {
|
badges {
|
||||||
id
|
id
|
||||||
key
|
|
||||||
icon
|
icon
|
||||||
}
|
}
|
||||||
location {
|
location {
|
||||||
@ -61,7 +59,6 @@ export default i18n => {
|
|||||||
commentsCount
|
commentsCount
|
||||||
badges {
|
badges {
|
||||||
id
|
id
|
||||||
key
|
|
||||||
icon
|
icon
|
||||||
}
|
}
|
||||||
location {
|
location {
|
||||||
|
|||||||
@ -1,4 +1,7 @@
|
|||||||
{
|
{
|
||||||
|
"filter-menu": {
|
||||||
|
"title": "Twoja bańka filtrująca"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
"made": "Z ❤ zrobiony",
|
"made": "Z ❤ zrobiony",
|
||||||
"imprint": "Nadruk",
|
"imprint": "Nadruk",
|
||||||
@ -13,6 +16,7 @@
|
|||||||
"responsible": "Odpowiedzialny zgodnie z § 55 Abs. 2 RStV (Niemcy)",
|
"responsible": "Odpowiedzialny zgodnie z § 55 Abs. 2 RStV (Niemcy)",
|
||||||
"bank": "rachunek bankowy",
|
"bank": "rachunek bankowy",
|
||||||
"germany": "Niemcy"
|
"germany": "Niemcy"
|
||||||
|
|
||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"copy": "Jeśli masz już konto Human Connection, zaloguj się tutaj.",
|
"copy": "Jeśli masz już konto Human Connection, zaloguj się tutaj.",
|
||||||
@ -20,9 +24,35 @@
|
|||||||
"logout": "Wyloguj się",
|
"logout": "Wyloguj się",
|
||||||
"email": "Twój adres e-mail",
|
"email": "Twój adres e-mail",
|
||||||
"password": "Twoje hasło",
|
"password": "Twoje hasło",
|
||||||
|
"forgotPassword": "Zapomniałeś hasła?",
|
||||||
"moreInfo": "Co to jest Human Connection?",
|
"moreInfo": "Co to jest Human Connection?",
|
||||||
|
"moreInfoURL": "https://human-connection.org/pl/",
|
||||||
|
"moreInfoHint": "na stronę prezentacji",
|
||||||
"hello": "Cześć"
|
"hello": "Cześć"
|
||||||
},
|
},
|
||||||
|
"password-reset": {
|
||||||
|
"title": "Zresetuj hasło",
|
||||||
|
"form": {
|
||||||
|
"description": "Na podany adres e-mail zostanie wysłany email z resetem hasła.",
|
||||||
|
"submit": "Poproś o wiadomość e-mail",
|
||||||
|
"submitted": "Na adres <b>{email}</b> została wysłana wiadomość z dalszymi instrukcjami."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"verify-code": {
|
||||||
|
"form": {
|
||||||
|
"code": "Wprowadź swój kod",
|
||||||
|
"description": "Otwórz swoją skrzynkę odbiorczą i wpisz kod, który do Ciebie wysłaliśmy.",
|
||||||
|
"next": "Kontynuuj",
|
||||||
|
"change-password": {
|
||||||
|
"success": "Zmiana hasła zakończyła się sukcesem!",
|
||||||
|
"error": "Zmiana hasła nie powiodła się. Może kod bezpieczeństwa nie był poprawny?",
|
||||||
|
"help": "W przypadku problemów, zachęcamy do zwrócenia się o pomoc, wysyłając do nas wiadomość e-mail:"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"editor": {
|
||||||
|
"placeholder": "Zostaw swoje inspirujące myśli...."
|
||||||
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
"name": "Mój profil",
|
"name": "Mój profil",
|
||||||
"memberSince": "Członek od",
|
"memberSince": "Członek od",
|
||||||
@ -31,7 +61,27 @@
|
|||||||
"following": "Obserwowani",
|
"following": "Obserwowani",
|
||||||
"shouted": "Krzyknij",
|
"shouted": "Krzyknij",
|
||||||
"commented": "Skomentuj",
|
"commented": "Skomentuj",
|
||||||
"userAnonym": "Anonymous"
|
"userAnonym": "Anonimowy",
|
||||||
|
"socialMedia": "Gdzie indziej mogę znaleźć",
|
||||||
|
"network": {
|
||||||
|
"title": "Sieć",
|
||||||
|
"following": "jest następująca:",
|
||||||
|
"followingNobody": "nie podąża za nikim.",
|
||||||
|
"followedBy": "po którym następuje:",
|
||||||
|
"followedByNobody": "nie jest śledzona przez nikogo.",
|
||||||
|
"and": "i",
|
||||||
|
"more": "więcej"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notifications": {
|
||||||
|
"menu": {
|
||||||
|
"mentioned": "wspomniała o tobie na posterunku."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"placeholder": "Wyszukiwanie",
|
||||||
|
"hint": "Czego szukasz?",
|
||||||
|
"failed": "Nic nie znaleziono"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"name": "Ustawienia",
|
"name": "Ustawienia",
|
||||||
@ -40,10 +90,28 @@
|
|||||||
"labelName": "Twoje dane",
|
"labelName": "Twoje dane",
|
||||||
"namePlaceholder": "Anonymous",
|
"namePlaceholder": "Anonymous",
|
||||||
"labelCity": "Twoje miasto lub region",
|
"labelCity": "Twoje miasto lub region",
|
||||||
"labelBio": "O Tobie"
|
"labelBio": "O Tobie",
|
||||||
|
"success": "Twoje dane zostały pomyślnie zaktualizowane!"
|
||||||
},
|
},
|
||||||
"security": {
|
"security": {
|
||||||
"name": "Bezpieczeństwo"
|
"name": "Bezpieczeństwo",
|
||||||
|
"change-password": {
|
||||||
|
"button": "Zmień hasło",
|
||||||
|
"success": "Hasło zostało pomyślnie zmienione!",
|
||||||
|
"label-old-password": "Twoje stare hasło",
|
||||||
|
"label-new-password": "Twoje nowe hasło",
|
||||||
|
"label-new-password-confirm": "Potwierdź nowe hasło",
|
||||||
|
"message-old-password-required": "Wprowadź swoje stare hasło",
|
||||||
|
"message-new-password-required": "Wprowadź nowe hasło",
|
||||||
|
"message-new-password-confirm-required": "Potwierdź nowe hasło.",
|
||||||
|
"message-new-password-missmatch": "Wpisz ponownie to samo hasło.",
|
||||||
|
"passwordSecurity": "Zabezpieczenie hasłem",
|
||||||
|
"passwordStrength0": "Bardzo niepewne hasło",
|
||||||
|
"passwordStrength1": "Niepewne hasło",
|
||||||
|
"passwordStrength2": "Hasło pośredniczące",
|
||||||
|
"passwordStrength3": "Silne hasło",
|
||||||
|
"passwordStrength4": "Bardzo mocne hasło"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"invites": {
|
"invites": {
|
||||||
"name": "Zaproszenia"
|
"name": "Zaproszenia"
|
||||||
@ -51,29 +119,42 @@
|
|||||||
"download": {
|
"download": {
|
||||||
"name": "Pobierz dane"
|
"name": "Pobierz dane"
|
||||||
},
|
},
|
||||||
"delete": {
|
"deleteUserAccount": {
|
||||||
"name": "Usuń konto"
|
"name": "Usuwanie danych",
|
||||||
|
"contributionsCount": "Usuń moje stanowiska.",
|
||||||
|
"commentsCount": "Usuń moje komentarze {liczba}.",
|
||||||
|
"accountDescription": "Bądź świadomy, że Twój post i komentarze są ważne dla naszej społeczności. Jeśli nadal chcesz je usunąć, musisz zaznaczyć je poniżej.",
|
||||||
|
"accountWarning": "<b>Nie możesz zarządzać</b> i <b>Nie możesz REKOVER</b> swoje konto, posty lub komentarze po usunięciu konta!",
|
||||||
|
"success": "Konto zostało pomyślnie usunięte",
|
||||||
|
"pleaseConfirm": "<b class='is-danger'>Niszczycielskie działanie!</b> Typ <b>{potwierdź}</b> aby potwierdzić"
|
||||||
},
|
},
|
||||||
"organizations": {
|
"organizations": {
|
||||||
"name": "Moje organizacje"
|
"name": "My Organizations"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
"name": "Języki"
|
"name": "Languages"
|
||||||
|
},
|
||||||
|
"social-media": {
|
||||||
|
"name": "Social media",
|
||||||
|
"placeholder": "Add social media url",
|
||||||
|
"submit": "Add link",
|
||||||
|
"successAdd": "Added social media. Updated user profile!",
|
||||||
|
"successDelete": "Deleted social media. Updated user profile!"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"admin": {
|
"admin": {
|
||||||
"name": "Administrator",
|
"name": "Admin",
|
||||||
"dashboard": {
|
"dashboard": {
|
||||||
"name": "Tablica rozdzielcza",
|
"name": "Tablica rozdzielcza",
|
||||||
"users": "Użytkownicy",
|
"users": "Użytkownicy",
|
||||||
"posts": "Posty",
|
"posts": "Stanowiska",
|
||||||
"comments": "Komentarze",
|
"comments": "Komentarze",
|
||||||
"notifications": "Powiadomienia",
|
"notifications": "Powiadomienia",
|
||||||
"organizations": "Organizacje",
|
"organizations": "Organizacje",
|
||||||
"projects": "Projekty",
|
"projects": "Projekty",
|
||||||
"invites": "Zaproszenia",
|
"invites": "Zaprasza",
|
||||||
"follows": "Obserwowań",
|
"follows": "Podąża za",
|
||||||
"shouts": "Okrzyk"
|
"shouts": "Zalecane"
|
||||||
},
|
},
|
||||||
"organizations": {
|
"organizations": {
|
||||||
"name": "Organizacje"
|
"name": "Organizacje"
|
||||||
@ -90,116 +171,193 @@
|
|||||||
"categories": {
|
"categories": {
|
||||||
"name": "Kategorie",
|
"name": "Kategorie",
|
||||||
"categoryName": "Nazwa",
|
"categoryName": "Nazwa",
|
||||||
"postCount": "Posty"
|
"postCount": "Stanowiska"
|
||||||
},
|
},
|
||||||
"tags": {
|
"tags": {
|
||||||
"name": "Tagi",
|
"name": "Znaczniki",
|
||||||
"tagCountUnique": "Użytkownicy",
|
"tagCountUnique": "Użytkownicy",
|
||||||
"tagCount": "Posty"
|
"tagCount": "Stanowiska"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"name": "Ustawienia"
|
"name": "Ustawienia"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"post": {
|
"post": {
|
||||||
"name": "Post",
|
"name": "Poczta",
|
||||||
"moreInfo": {
|
"moreInfo": {
|
||||||
"name": "Więcej informacji"
|
"name": "Więcej informacji"
|
||||||
},
|
},
|
||||||
"takeAction": {
|
"takeAction": {
|
||||||
"name": "Podejmij działanie"
|
"name": "Podejmij działania"
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"edit": "Edytuj Post",
|
||||||
|
"delete": "Usuń wpis"
|
||||||
|
},
|
||||||
|
"comment": {
|
||||||
|
"submit": "Komentarz",
|
||||||
|
"submitted": "Przedłożony komentarz"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"comment": {
|
||||||
|
"content": {
|
||||||
|
"unavailable-placeholder": " ...ten komentarz nie jest już dostępny."
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"edit": "Edytuj komentarz",
|
||||||
|
"delete": "Usuń komentarz"
|
||||||
|
},
|
||||||
|
"show": {
|
||||||
|
"more": "Pokaż więcej",
|
||||||
|
"less": "Pokaż mniej"
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
"quotes": {
|
"quotes": {
|
||||||
"african": {
|
"african": {
|
||||||
"quote": "Wielu małych ludzi w wielu małych miejscach robi wiele małych rzeczy, które mogą zmienić oblicze świata.",
|
"quote": "Wielu małych ludzi w wielu małych miejscowościach robi wiele małych rzeczy, które mogą zmienić oblicze świata.",
|
||||||
"author": "Afrykańskie przysłowie"
|
"author": "Afrykańskie przysłowie"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"common": {
|
"common": {
|
||||||
"post": "Post ::: Posty",
|
"post": "Poczta ::: Posty",
|
||||||
"comment": "Komentarz ::: Komentarze",
|
"comment": "Komentarz ::: Komentarze",
|
||||||
"letsTalk": "Porozmawiajmy",
|
"letsTalk": "Porozmawiajmy",
|
||||||
"versus": "Versus",
|
"versus": "werset",
|
||||||
"moreInfo": "Więcej informacji",
|
"moreInfo": "Więcej informacji",
|
||||||
"takeAction": "Podejmij działanie",
|
"takeAction": "Podejmij działania",
|
||||||
"shout": "okrzyk okrzyki",
|
"shout": "przekazanie sprawy ::: Polecam tę stronę",
|
||||||
"user": "Użytkownik ::: Użytkownicy",
|
"user": "Użytkownik ::: Użytkownicy",
|
||||||
"category": "kategoria kategorie",
|
"category": "Kategoria ::: Kategorie",
|
||||||
"organization": "Organizacja ::: Organizacje",
|
"organization": "Organization ::: Organizations",
|
||||||
"project": "Projekt ::: Projekty",
|
"project": "Projekt ::: Projekty",
|
||||||
"tag": "Tag ::: Tagi",
|
"tag": "Znacznik ::: Znaczniki",
|
||||||
"name": "imię",
|
"name": "Nazwa",
|
||||||
"loadMore": "załaduj więcej",
|
"loadMore": "Obciążenie więcej",
|
||||||
"loading": "ładowanie",
|
"loading": "załadunek",
|
||||||
"reportContent": "Raport"
|
"reportContent": "Sprawozdanie",
|
||||||
|
"validations": {
|
||||||
|
"email": "musi być ważny adres e-mail.",
|
||||||
|
"verification-code": "musi mieć długość 6 znaków."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"actions": {
|
"actions": {
|
||||||
"loading": "ładowanie",
|
"loading": "załadunek",
|
||||||
"loadMore": "załaduj więcej",
|
"loadMore": "Obciążenie więcej",
|
||||||
"create": "Stwórz",
|
"create": "Tworzenie",
|
||||||
"save": "Zapisz",
|
"save": "Oszczędzaj",
|
||||||
"edit": "Edytuj",
|
"edit": "Edycja",
|
||||||
"delete": "Usuń",
|
"delete": "Usuń",
|
||||||
"cancel": "Anuluj"
|
"cancel": "Odwołaj"
|
||||||
},
|
},
|
||||||
"moderation": {
|
"moderation": {
|
||||||
"name": "Moderacja",
|
"name": "Umiarkowanie",
|
||||||
"reports": {
|
"reports": {
|
||||||
"empty": "Gratulacje, moderacja nie jest potrzebna",
|
"empty": "Gratulacje, nic do umiarkowanego.",
|
||||||
"name": "Raporty",
|
"name": "Sprawozdania",
|
||||||
"reporter": "zgłoszone przez"
|
"submitter": "zgłaszane przez",
|
||||||
|
"disabledBy": "niepełnosprawni przez"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"disable": {
|
"disable": {
|
||||||
|
"submit": "Niepełnosprawność",
|
||||||
|
"cancel": "Odwołaj",
|
||||||
|
"success": "Niepełnosprawni skutecznie",
|
||||||
"user": {
|
"user": {
|
||||||
"title": "Ukryj użytkownika",
|
"title": "Wyłączenie użytkownika",
|
||||||
"type": "Użytkownik",
|
"type": "Użytkownik",
|
||||||
"message": "Czy na pewno chcesz wyłączyć użytkownika \" <b> {name} </b> \"?"
|
"message": "Czy naprawdę chcesz wyłączyć użytkownika \"<b>{name}</b>\"?"
|
||||||
},
|
},
|
||||||
"contribution": {
|
"contribution": {
|
||||||
"title": "Ukryj wpis",
|
"title": "Wyłącz Wkład",
|
||||||
"type": "Wpis / Post",
|
"type": "Wkład",
|
||||||
"message": "Czy na pewno chcesz ukryć wpis \" <b> tytuł} </b> \"?"
|
"message": "Naprawdę chcesz unieszkodliwić ten wkład \"<b>{name}</b>\"?"
|
||||||
},
|
},
|
||||||
"comment": {
|
"comment": {
|
||||||
"title": "Ukryj wpis",
|
"title": "Wyłącz komentarz",
|
||||||
"type": "Komentarz",
|
"type": "Komentarz",
|
||||||
"message": "Czy na pewno chcesz ukryć komentarz użytkownika\"<b>(Imie/Avatar</b>\"?"
|
"message": "Naprawdę chcesz wyłączyć komentarz \"<b>{name}</b>\"?"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"delete": {
|
||||||
|
"submit": "Usuń",
|
||||||
|
"cancel": "Odwołaj",
|
||||||
|
"contribution": {
|
||||||
|
"title": "Usuń Post",
|
||||||
|
"type": "Wkład",
|
||||||
|
"message": "Naprawdę chcesz usunąć post \"<b>{name}</b>\"?",
|
||||||
|
"success": "Wyślij pomyślnie usunięty!"
|
||||||
|
},
|
||||||
|
"comment": {
|
||||||
|
"title": "Usuń komentarz",
|
||||||
|
"type": "Komentarz",
|
||||||
|
"message": "Czy naprawdę chcesz usunąć komentarz \"<b>{name}</b>\"?",
|
||||||
|
"success": "Komentarz został pomyślnie usunięty!"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"report": {
|
"report": {
|
||||||
"submit": "Wyślij raport",
|
"submit": "Sprawozdanie",
|
||||||
"cancel": "Anuluj",
|
"cancel": "Odwołaj",
|
||||||
|
"success": "Dzięki za zgłoszenie!",
|
||||||
"user": {
|
"user": {
|
||||||
"title": "Zgłoś użytkownika",
|
"title": "Raport Użytkownik",
|
||||||
"type": "Użytkownik",
|
"type": "Użytkownik",
|
||||||
"message": "Czy na pewno chcesz zgłosić użytkownika \" <b> {Imie} </b> \"?"
|
"message": "Naprawdę chcesz zgłosić użytkownika \"<b>{name}</b>\"?",
|
||||||
|
"error": "Zgłosiłeś już użytkownika!"
|
||||||
},
|
},
|
||||||
"contribution": {
|
"contribution": {
|
||||||
"title": "Zgłoś wpis",
|
"title": "Wkład w raport",
|
||||||
"type": "Wpis / Post",
|
"type": "Wkład",
|
||||||
"message": "Czy na pewno chcesz zgłosić ten wpis użytkownika \" <b> {Imie} </b> \"?"
|
"message": "Naprawdę chcesz zgłosić wkład, jaki wniosłaś do programu \"<b>{name}</b>\"?",
|
||||||
|
"error": "Zgłosiłeś już ten wkład!"
|
||||||
},
|
},
|
||||||
"comment": {
|
"comment": {
|
||||||
"title": "Zgłoś komentarz",
|
"title": "Sprawozdanie Komentarz",
|
||||||
"type": "Komentarz",
|
"type": "Komentarz",
|
||||||
"message": "Czy na pewno chcesz zgłosić komentarz użytkownika\"<b>(Imie/Avatar</b>\"?"
|
"message": "Naprawdę chcesz zgłosić komentarz od \"<b>{name}</b>\"?",
|
||||||
|
"error": "Zgłosiłeś już komentarz!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"followButton": {
|
||||||
|
"follow": "naśladować",
|
||||||
|
"following": "w skutek"
|
||||||
|
},
|
||||||
|
"shoutButton": {
|
||||||
|
"shouted": "wykrzyczany"
|
||||||
|
},
|
||||||
|
"release": {
|
||||||
|
"submit": "Zwolnienie",
|
||||||
|
"cancel": "Odwołaj",
|
||||||
|
"success": "Wydany z powodzeniem!",
|
||||||
|
"user": {
|
||||||
|
"title": "Zwolnienie użytkownika",
|
||||||
|
"type": "Użytkownik",
|
||||||
|
"message": "Naprawdę chcesz uwolnić użytkownika \"<b>{name}</b>\"?"
|
||||||
|
},
|
||||||
|
"contribution": {
|
||||||
|
"title": "Zwolnienie Wkład",
|
||||||
|
"type": "Wkład",
|
||||||
|
"message": "Naprawdę chcesz uwolnić swój wkład \"<b>{name}</b>\"?"
|
||||||
|
},
|
||||||
|
"comment": {
|
||||||
|
"title": "Zwolnienie komentarz",
|
||||||
|
"type": "komentarz",
|
||||||
|
"message": "Czy naprawdę chcesz opublikować komentarz od \"<b>{name}</b>\"?"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"user": {
|
||||||
|
"avatar": {
|
||||||
|
"submitted": "Przesłanie udane"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"contribution": {
|
"contribution": {
|
||||||
"edit": "Edytuj wpis",
|
"newPost": "Utwórz nowy post",
|
||||||
"delete": "Usuń wpis"
|
"filterFollow": "Filtrowanie wkładu użytkowników, za którymi podążam",
|
||||||
},
|
"filterALL": "Wyświetl wszystkie wkłady",
|
||||||
"comment": {
|
"success": "Zachowany!",
|
||||||
"edit": "Edytuj komentarz",
|
"languageSelectLabel": "Język",
|
||||||
"delete": "Usuń komentarz"
|
"categories": {
|
||||||
},
|
"infoSelectedNoOfMaxCategories": "{chosen} z {max} wybrane kategorie"
|
||||||
"followButton": {
|
}
|
||||||
"follow": "Obserwuj",
|
|
||||||
"following": "Obserwowani"
|
|
||||||
},
|
|
||||||
"shoutButton": {
|
|
||||||
"shouted": "krzyczeć"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -111,7 +111,6 @@ export default {
|
|||||||
}
|
}
|
||||||
badges {
|
badges {
|
||||||
id
|
id
|
||||||
key
|
|
||||||
icon
|
icon
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user