Merge pull request #84 from AdvancedAlgos/feature/notifications-integration
Feature/notifications integration
This commit is contained in:
38 files changed
+1645
-2095
No files matched your search
@@ -2,6 +2,8 @@
|
||||
/.env.prod
|
||||
/database/.env
|
||||
/database/docker-compose.prisma.prod.yml
|
||||
/database/*.zip
|
||||
/database/data-archive
|
||||
/docker-compose.prisma.prod.yml
|
||||
/docker-compose.prod.yml
|
||||
.graphqlconfig.prod.yml
|
||||
|
||||
@@ -39,15 +39,17 @@ type Team {
|
||||
}
|
||||
|
||||
type TeamProfile {
|
||||
id: ID! @unique
|
||||
description: String
|
||||
motto: String
|
||||
avatar: String
|
||||
banner: String
|
||||
updatedAt: DateTime!
|
||||
createdAt: DateTime!
|
||||
updatedAt: DateTime!
|
||||
}
|
||||
|
||||
type TeamStatus {
|
||||
id: ID! @unique
|
||||
status: Status @Default(value: inactive)
|
||||
reason: String
|
||||
createdAt: DateTime!
|
||||
@@ -61,7 +63,6 @@ type TeamMembers {
|
||||
status: [TeamMemberStatus!]!
|
||||
email: String @unique
|
||||
createdAt: DateTime!
|
||||
updatedAt: DateTime!
|
||||
}
|
||||
|
||||
type TeamMemberStatus {
|
||||
@@ -82,14 +83,16 @@ type Member {
|
||||
}
|
||||
|
||||
type MemberStatus {
|
||||
id: ID! @unique
|
||||
status: Status @Default(value: INACTIVE)
|
||||
reason: String
|
||||
createdAt: DateTime!
|
||||
}
|
||||
|
||||
type Wallet {
|
||||
id: ID! @unique
|
||||
balance: Float
|
||||
updatedAt: DateTime!
|
||||
createdAt: DateTime!
|
||||
}
|
||||
|
||||
type FinancialBeings {
|
||||
@@ -101,11 +104,10 @@ type FinancialBeings {
|
||||
avatar: String
|
||||
team: Team @relation (name: "TeamFinancialBeing", onDelete: SET_NULL)
|
||||
status: [FBStatus!]!
|
||||
updatedAt: DateTime!
|
||||
createdAt: DateTime!
|
||||
}
|
||||
|
||||
type FBStatus {
|
||||
id: ID! @unique
|
||||
status: Status @Default(value: inactive)
|
||||
reason: String
|
||||
createdAt: DateTime!
|
||||
|
||||
Generated
+747
-1642
File diff suppressed because it is too large.
Load diff
+13
-13
@@ -8,41 +8,41 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@azure/storage-blob": "^10.1.0-preview",
|
||||
"@babel/cli": "^7.1.5",
|
||||
"@babel/core": "^7.1.5",
|
||||
"@babel/node": "^7.0.0",
|
||||
"@babel/cli": "^7.2.0",
|
||||
"@babel/core": "^7.2.0",
|
||||
"@babel/node": "^7.2.0",
|
||||
"@babel/polyfill": "^7.0.0",
|
||||
"@babel/preset-env": "^7.1.5",
|
||||
"@babel/preset-env": "^7.2.0",
|
||||
"@babel/register": "^7.0.0",
|
||||
"apollo-errors": "^1.9.0",
|
||||
"apollo-server-express": "^2.2.2",
|
||||
"apollo-server-express": "^2.2.6",
|
||||
"axios": "^0.18.0",
|
||||
"cors": "^2.8.5",
|
||||
"debug": "^4.1.0",
|
||||
"dotenv": "^6.1.0",
|
||||
"express": "^4.16.4",
|
||||
"express-jwt": "^5.3.1",
|
||||
"fast-xml-parser": "^3.12.7",
|
||||
"fast-xml-parser": "^3.12.10",
|
||||
"graphql-import": "^0.7.1",
|
||||
"graphql-middleware": "^1.7.8",
|
||||
"graphql-subscriptions": "^1.0.0",
|
||||
"graphql-tag": "^2.10.0",
|
||||
"graphql-tools": "^4.0.3",
|
||||
"jsonwebtoken": "^8.3.0",
|
||||
"jsonwebtoken": "^8.4.0",
|
||||
"jwks-rsa": "^1.3.0",
|
||||
"lodash.get": "^4.4.2",
|
||||
"nodemon": "^1.18.6",
|
||||
"prisma-binding": "^2.1.6",
|
||||
"nodemon": "^1.18.7",
|
||||
"prisma-binding": "^2.2.8",
|
||||
"request": "^2.88.0",
|
||||
"request-promise-native": "^1.0.5",
|
||||
"winston": "^3.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/plugin-proposal-class-properties": "^7.1.0",
|
||||
"@babel/plugin-proposal-throw-expressions": "^7.0.0",
|
||||
"@babel/plugin-proposal-class-properties": "^7.2.1",
|
||||
"@babel/plugin-proposal-throw-expressions": "^7.2.0",
|
||||
"graphql-cli": "^2.17.0",
|
||||
"lodash.merge": "^4.6.1",
|
||||
"npm-run-all": "4.1.3",
|
||||
"prisma": "^1.20.1"
|
||||
"npm-run-all": "4.1.5",
|
||||
"prisma": "^1.22.0"
|
||||
}
|
||||
}
|
||||
@@ -1,153 +0,0 @@
|
||||
var jwt = require('jsonwebtoken')
|
||||
var axios = require('axios')
|
||||
|
||||
import { logger } from '../logger'
|
||||
|
||||
const sendTeamMemberInvite = function(email, team) {
|
||||
const dev = process.env.NODE_ENV === 'development' ? true : false
|
||||
logger.info(`sendTeamMemberInvite email|team: ${email} | ${team}`)
|
||||
const API_KEY = process.env.SG_APIKEY
|
||||
const token = jwt.sign({ email: email, team: team.slug }, API_KEY, { expiresIn: '7d' })
|
||||
let origin = 'https://teams.advancedalgos.net'
|
||||
const params = '/activate-team-membership/'
|
||||
if (dev){
|
||||
origin = 'http://localhost:3001'
|
||||
}
|
||||
|
||||
const headers = {
|
||||
'Content-Type': 'application/json',
|
||||
'Access-Control-Allow-Origin' : origin,
|
||||
'Access-Control-Allow-Credentials': 'true'
|
||||
};
|
||||
|
||||
const data = JSON.stringify({
|
||||
"personalizations": [
|
||||
{
|
||||
"to": [
|
||||
{
|
||||
"email": email
|
||||
}
|
||||
],
|
||||
dynamic_template_data: {
|
||||
"aateaminvitelink": origin + params + token,
|
||||
"aateamname": team.name,
|
||||
"subject": "INVITATION: Join team " + team.name
|
||||
},
|
||||
"subject": "INVITATION: Join team " + team.name
|
||||
}
|
||||
],
|
||||
"from": {
|
||||
"email": "noreply@advancedalgos.net",
|
||||
"name": "Advanced Algos Teams"
|
||||
},
|
||||
"reply_to": {
|
||||
"email": "feedback@advancedalgos.net",
|
||||
"name": "Advanced Algos Teams"
|
||||
},
|
||||
"template_id": process.env.SG_INVITE_EMAILID
|
||||
})
|
||||
|
||||
let sendVerify = axios({
|
||||
method: 'post',
|
||||
url: 'https://api.sendgrid.com/v3/mail/send',
|
||||
data: data,
|
||||
headers:{
|
||||
'content-type': 'application/json',
|
||||
'authorization': 'Bearer ' + API_KEY
|
||||
}
|
||||
})
|
||||
.then(function (response) {
|
||||
if (response.status >= 200 && response.status < 300) {
|
||||
return 'Success'
|
||||
} else {
|
||||
throw response.data.errors[0].message
|
||||
}
|
||||
})
|
||||
.catch(function (error) {
|
||||
return `${error.status}-${error.response.data.errors[0].message}`
|
||||
})
|
||||
return sendVerify
|
||||
}
|
||||
|
||||
const sendTeamCreateConfirmation = function(email, teamName, botName) {
|
||||
const dev = process.env.NODE_ENV === 'development' ? true : false
|
||||
logger.info(`sendTeamCreateConfirmation email|teamName|botName: ${email} | ${teamName} | ${botName}`)
|
||||
const API_KEY = process.env.SG_APIKEY
|
||||
let origin = 'https://teams.advancedalgos.net'
|
||||
if (dev){
|
||||
origin = 'http://localhost:3001'
|
||||
}
|
||||
|
||||
const headers = {
|
||||
'Content-Type': 'application/json',
|
||||
'Access-Control-Allow-Origin' : origin,
|
||||
'Access-Control-Allow-Credentials': 'true'
|
||||
};
|
||||
|
||||
const data = JSON.stringify({
|
||||
"personalizations": [
|
||||
{
|
||||
"to": [
|
||||
{
|
||||
"email": email
|
||||
}
|
||||
],
|
||||
dynamic_template_data: {
|
||||
"aadeveloplink": "https://develop.advancedalgos.net/index.html",
|
||||
"aateamname": teamName,
|
||||
"aabotname": botName,
|
||||
"subject": "Team " + teamName + " has been created!"
|
||||
},
|
||||
"subject": "Team " + teamName + " has been created!"
|
||||
}
|
||||
],
|
||||
"from": {
|
||||
"email": "noreply@advancedalgos.net",
|
||||
"name": "Advanced Algos Teams"
|
||||
},
|
||||
"reply_to": {
|
||||
"email": "feedback@advancedalgos.net",
|
||||
"name": "Advanced Algos Teams"
|
||||
},
|
||||
"template_id": process.env.SG_TEAMCREATE_EMAILID
|
||||
})
|
||||
|
||||
let sendTeamCreation = axios({
|
||||
method: 'post',
|
||||
url: 'https://api.sendgrid.com/v3/mail/send',
|
||||
data: data,
|
||||
headers:{
|
||||
'content-type': 'application/json',
|
||||
'authorization': 'Bearer ' + API_KEY
|
||||
}
|
||||
})
|
||||
.then(function (response) {
|
||||
if (response.status >= 200 && response.status < 300) {
|
||||
return 'Success'
|
||||
} else {
|
||||
throw response.data.errors[0].message
|
||||
}
|
||||
})
|
||||
.catch(function (error) {
|
||||
return `${error.status}-${error.response.data.errors[0].message}`
|
||||
})
|
||||
return sendTeamCreation
|
||||
}
|
||||
|
||||
const verifyInviteToken = async function(token) {
|
||||
const API_KEY = process.env.SG_APIKEY
|
||||
let verifiedToken
|
||||
try {
|
||||
verifiedToken = await jwt.verify(token, API_KEY, {maxAge: '7d'})
|
||||
} catch(err) {
|
||||
if (err.name === "TokenExpiredError"){
|
||||
throw new Error ("Error: Token Expired. Please request new invitation or apply to the team again")
|
||||
} else {
|
||||
throw new Error (`Error: Token error - ${err.message}`)
|
||||
}
|
||||
}
|
||||
logger.info(`verifyInviteToken: ${verifiedToken}`)
|
||||
return verifiedToken
|
||||
}
|
||||
|
||||
module.exports = { sendTeamMemberInvite, sendTeamCreateConfirmation, verifyInviteToken }
|
||||
@@ -1,5 +1,5 @@
|
||||
# source: http://localhost:4466
|
||||
# timestamp: Tue Nov 13 2018 13:35:00 GMT-0800 (PST)
|
||||
# timestamp: Tue Nov 20 2018 09:55:31 GMT-0800 (Pacific Standard Time)
|
||||
|
||||
type AggregateFBStatus {
|
||||
count: Int!
|
||||
@@ -55,7 +55,8 @@ enum FBKind {
|
||||
PLOTTER
|
||||
}
|
||||
|
||||
type FBStatus {
|
||||
type FBStatus implements Node {
|
||||
id: ID!
|
||||
status: Status
|
||||
reason: String
|
||||
createdAt: DateTime!
|
||||
@@ -78,6 +79,7 @@ input FBStatusCreateInput {
|
||||
|
||||
input FBStatusCreateManyInput {
|
||||
create: [FBStatusCreateInput!]
|
||||
connect: [FBStatusWhereUniqueInput!]
|
||||
}
|
||||
|
||||
"""An edge in a connection."""
|
||||
@@ -90,19 +92,20 @@ type FBStatusEdge {
|
||||
}
|
||||
|
||||
enum FBStatusOrderByInput {
|
||||
id_ASC
|
||||
id_DESC
|
||||
status_ASC
|
||||
status_DESC
|
||||
reason_ASC
|
||||
reason_DESC
|
||||
createdAt_ASC
|
||||
createdAt_DESC
|
||||
id_ASC
|
||||
id_DESC
|
||||
updatedAt_ASC
|
||||
updatedAt_DESC
|
||||
}
|
||||
|
||||
type FBStatusPreviousValues {
|
||||
id: ID!
|
||||
status: Status
|
||||
reason: String
|
||||
createdAt: DateTime!
|
||||
@@ -147,8 +150,23 @@ input FBStatusSubscriptionWhereInput {
|
||||
node: FBStatusWhereInput
|
||||
}
|
||||
|
||||
input FBStatusUpdateDataInput {
|
||||
status: Status
|
||||
reason: String
|
||||
}
|
||||
|
||||
input FBStatusUpdateInput {
|
||||
status: Status
|
||||
reason: String
|
||||
}
|
||||
|
||||
input FBStatusUpdateManyInput {
|
||||
create: [FBStatusCreateInput!]
|
||||
connect: [FBStatusWhereUniqueInput!]
|
||||
disconnect: [FBStatusWhereUniqueInput!]
|
||||
delete: [FBStatusWhereUniqueInput!]
|
||||
update: [FBStatusUpdateWithWhereUniqueNestedInput!]
|
||||
upsert: [FBStatusUpsertWithWhereUniqueNestedInput!]
|
||||
}
|
||||
|
||||
input FBStatusUpdateManyMutationInput {
|
||||
@@ -156,6 +174,17 @@ input FBStatusUpdateManyMutationInput {
|
||||
reason: String
|
||||
}
|
||||
|
||||
input FBStatusUpdateWithWhereUniqueNestedInput {
|
||||
where: FBStatusWhereUniqueInput!
|
||||
data: FBStatusUpdateDataInput!
|
||||
}
|
||||
|
||||
input FBStatusUpsertWithWhereUniqueNestedInput {
|
||||
where: FBStatusWhereUniqueInput!
|
||||
update: FBStatusUpdateDataInput!
|
||||
create: FBStatusCreateInput!
|
||||
}
|
||||
|
||||
input FBStatusWhereInput {
|
||||
"""Logical AND on all given filters."""
|
||||
AND: [FBStatusWhereInput!]
|
||||
@@ -165,6 +194,46 @@ input FBStatusWhereInput {
|
||||
|
||||
"""Logical NOT on all given filters combined by AND."""
|
||||
NOT: [FBStatusWhereInput!]
|
||||
id: ID
|
||||
|
||||
"""All values that are not equal to given value."""
|
||||
id_not: ID
|
||||
|
||||
"""All values that are contained in given list."""
|
||||
id_in: [ID!]
|
||||
|
||||
"""All values that are not contained in given list."""
|
||||
id_not_in: [ID!]
|
||||
|
||||
"""All values less than the given value."""
|
||||
id_lt: ID
|
||||
|
||||
"""All values less than or equal the given value."""
|
||||
id_lte: ID
|
||||
|
||||
"""All values greater than the given value."""
|
||||
id_gt: ID
|
||||
|
||||
"""All values greater than or equal the given value."""
|
||||
id_gte: ID
|
||||
|
||||
"""All values containing the given string."""
|
||||
id_contains: ID
|
||||
|
||||
"""All values not containing the given string."""
|
||||
id_not_contains: ID
|
||||
|
||||
"""All values starting with the given string."""
|
||||
id_starts_with: ID
|
||||
|
||||
"""All values not starting with the given string."""
|
||||
id_not_starts_with: ID
|
||||
|
||||
"""All values ending with the given string."""
|
||||
id_ends_with: ID
|
||||
|
||||
"""All values not ending with the given string."""
|
||||
id_not_ends_with: ID
|
||||
status: Status
|
||||
|
||||
"""All values that are not equal to given value."""
|
||||
@@ -239,6 +308,10 @@ input FBStatusWhereInput {
|
||||
createdAt_gte: DateTime
|
||||
}
|
||||
|
||||
input FBStatusWhereUniqueInput {
|
||||
id: ID
|
||||
}
|
||||
|
||||
enum FBType {
|
||||
BOT
|
||||
NET
|
||||
@@ -738,7 +811,8 @@ type MemberPreviousValues {
|
||||
createdAt: DateTime!
|
||||
}
|
||||
|
||||
type MemberStatus {
|
||||
type MemberStatus implements Node {
|
||||
id: ID!
|
||||
status: Status
|
||||
reason: String
|
||||
createdAt: DateTime!
|
||||
@@ -761,6 +835,7 @@ input MemberStatusCreateInput {
|
||||
|
||||
input MemberStatusCreateManyInput {
|
||||
create: [MemberStatusCreateInput!]
|
||||
connect: [MemberStatusWhereUniqueInput!]
|
||||
}
|
||||
|
||||
"""An edge in a connection."""
|
||||
@@ -773,19 +848,20 @@ type MemberStatusEdge {
|
||||
}
|
||||
|
||||
enum MemberStatusOrderByInput {
|
||||
id_ASC
|
||||
id_DESC
|
||||
status_ASC
|
||||
status_DESC
|
||||
reason_ASC
|
||||
reason_DESC
|
||||
createdAt_ASC
|
||||
createdAt_DESC
|
||||
id_ASC
|
||||
id_DESC
|
||||
updatedAt_ASC
|
||||
updatedAt_DESC
|
||||
}
|
||||
|
||||
type MemberStatusPreviousValues {
|
||||
id: ID!
|
||||
status: Status
|
||||
reason: String
|
||||
createdAt: DateTime!
|
||||
@@ -830,8 +906,23 @@ input MemberStatusSubscriptionWhereInput {
|
||||
node: MemberStatusWhereInput
|
||||
}
|
||||
|
||||
input MemberStatusUpdateDataInput {
|
||||
status: Status
|
||||
reason: String
|
||||
}
|
||||
|
||||
input MemberStatusUpdateInput {
|
||||
status: Status
|
||||
reason: String
|
||||
}
|
||||
|
||||
input MemberStatusUpdateManyInput {
|
||||
create: [MemberStatusCreateInput!]
|
||||
connect: [MemberStatusWhereUniqueInput!]
|
||||
disconnect: [MemberStatusWhereUniqueInput!]
|
||||
delete: [MemberStatusWhereUniqueInput!]
|
||||
update: [MemberStatusUpdateWithWhereUniqueNestedInput!]
|
||||
upsert: [MemberStatusUpsertWithWhereUniqueNestedInput!]
|
||||
}
|
||||
|
||||
input MemberStatusUpdateManyMutationInput {
|
||||
@@ -839,6 +930,17 @@ input MemberStatusUpdateManyMutationInput {
|
||||
reason: String
|
||||
}
|
||||
|
||||
input MemberStatusUpdateWithWhereUniqueNestedInput {
|
||||
where: MemberStatusWhereUniqueInput!
|
||||
data: MemberStatusUpdateDataInput!
|
||||
}
|
||||
|
||||
input MemberStatusUpsertWithWhereUniqueNestedInput {
|
||||
where: MemberStatusWhereUniqueInput!
|
||||
update: MemberStatusUpdateDataInput!
|
||||
create: MemberStatusCreateInput!
|
||||
}
|
||||
|
||||
input MemberStatusWhereInput {
|
||||
"""Logical AND on all given filters."""
|
||||
AND: [MemberStatusWhereInput!]
|
||||
@@ -848,6 +950,46 @@ input MemberStatusWhereInput {
|
||||
|
||||
"""Logical NOT on all given filters combined by AND."""
|
||||
NOT: [MemberStatusWhereInput!]
|
||||
id: ID
|
||||
|
||||
"""All values that are not equal to given value."""
|
||||
id_not: ID
|
||||
|
||||
"""All values that are contained in given list."""
|
||||
id_in: [ID!]
|
||||
|
||||
"""All values that are not contained in given list."""
|
||||
id_not_in: [ID!]
|
||||
|
||||
"""All values less than the given value."""
|
||||
id_lt: ID
|
||||
|
||||
"""All values less than or equal the given value."""
|
||||
id_lte: ID
|
||||
|
||||
"""All values greater than the given value."""
|
||||
id_gt: ID
|
||||
|
||||
"""All values greater than or equal the given value."""
|
||||
id_gte: ID
|
||||
|
||||
"""All values containing the given string."""
|
||||
id_contains: ID
|
||||
|
||||
"""All values not containing the given string."""
|
||||
id_not_contains: ID
|
||||
|
||||
"""All values starting with the given string."""
|
||||
id_starts_with: ID
|
||||
|
||||
"""All values not starting with the given string."""
|
||||
id_not_starts_with: ID
|
||||
|
||||
"""All values ending with the given string."""
|
||||
id_ends_with: ID
|
||||
|
||||
"""All values not ending with the given string."""
|
||||
id_not_ends_with: ID
|
||||
status: Status
|
||||
|
||||
"""All values that are not equal to given value."""
|
||||
@@ -922,6 +1064,10 @@ input MemberStatusWhereInput {
|
||||
createdAt_gte: DateTime
|
||||
}
|
||||
|
||||
input MemberStatusWhereUniqueInput {
|
||||
id: ID
|
||||
}
|
||||
|
||||
type MemberSubscriptionPayload {
|
||||
mutation: MutationType!
|
||||
node: Member
|
||||
@@ -1179,17 +1325,32 @@ type Mutation {
|
||||
updateTeamMembers(data: TeamMembersUpdateInput!, where: TeamMembersWhereUniqueInput!): TeamMembers
|
||||
updateMember(data: MemberUpdateInput!, where: MemberWhereUniqueInput!): Member
|
||||
updateFinancialBeings(data: FinancialBeingsUpdateInput!, where: FinancialBeingsWhereUniqueInput!): FinancialBeings
|
||||
updateTeamProfile(data: TeamProfileUpdateInput!, where: TeamProfileWhereUniqueInput!): TeamProfile
|
||||
updateWallet(data: WalletUpdateInput!, where: WalletWhereUniqueInput!): Wallet
|
||||
updateMemberStatus(data: MemberStatusUpdateInput!, where: MemberStatusWhereUniqueInput!): MemberStatus
|
||||
updateFBStatus(data: FBStatusUpdateInput!, where: FBStatusWhereUniqueInput!): FBStatus
|
||||
updateTeamMemberStatus(data: TeamMemberStatusUpdateInput!, where: TeamMemberStatusWhereUniqueInput!): TeamMemberStatus
|
||||
updateTeamStatus(data: TeamStatusUpdateInput!, where: TeamStatusWhereUniqueInput!): TeamStatus
|
||||
deleteTeam(where: TeamWhereUniqueInput!): Team
|
||||
deleteTeamMembers(where: TeamMembersWhereUniqueInput!): TeamMembers
|
||||
deleteMember(where: MemberWhereUniqueInput!): Member
|
||||
deleteFinancialBeings(where: FinancialBeingsWhereUniqueInput!): FinancialBeings
|
||||
deleteTeamProfile(where: TeamProfileWhereUniqueInput!): TeamProfile
|
||||
deleteWallet(where: WalletWhereUniqueInput!): Wallet
|
||||
deleteMemberStatus(where: MemberStatusWhereUniqueInput!): MemberStatus
|
||||
deleteFBStatus(where: FBStatusWhereUniqueInput!): FBStatus
|
||||
deleteTeamMemberStatus(where: TeamMemberStatusWhereUniqueInput!): TeamMemberStatus
|
||||
deleteTeamStatus(where: TeamStatusWhereUniqueInput!): TeamStatus
|
||||
upsertTeam(where: TeamWhereUniqueInput!, create: TeamCreateInput!, update: TeamUpdateInput!): Team!
|
||||
upsertTeamMembers(where: TeamMembersWhereUniqueInput!, create: TeamMembersCreateInput!, update: TeamMembersUpdateInput!): TeamMembers!
|
||||
upsertMember(where: MemberWhereUniqueInput!, create: MemberCreateInput!, update: MemberUpdateInput!): Member!
|
||||
upsertFinancialBeings(where: FinancialBeingsWhereUniqueInput!, create: FinancialBeingsCreateInput!, update: FinancialBeingsUpdateInput!): FinancialBeings!
|
||||
upsertTeamProfile(where: TeamProfileWhereUniqueInput!, create: TeamProfileCreateInput!, update: TeamProfileUpdateInput!): TeamProfile!
|
||||
upsertWallet(where: WalletWhereUniqueInput!, create: WalletCreateInput!, update: WalletUpdateInput!): Wallet!
|
||||
upsertMemberStatus(where: MemberStatusWhereUniqueInput!, create: MemberStatusCreateInput!, update: MemberStatusUpdateInput!): MemberStatus!
|
||||
upsertFBStatus(where: FBStatusWhereUniqueInput!, create: FBStatusCreateInput!, update: FBStatusUpdateInput!): FBStatus!
|
||||
upsertTeamMemberStatus(where: TeamMemberStatusWhereUniqueInput!, create: TeamMemberStatusCreateInput!, update: TeamMemberStatusUpdateInput!): TeamMemberStatus!
|
||||
upsertTeamStatus(where: TeamStatusWhereUniqueInput!, create: TeamStatusCreateInput!, update: TeamStatusUpdateInput!): TeamStatus!
|
||||
updateManyTeams(data: TeamUpdateManyMutationInput!, where: TeamWhereInput): BatchPayload!
|
||||
updateManyTeamMemberses(data: TeamMembersUpdateManyMutationInput!, where: TeamMembersWhereInput): BatchPayload!
|
||||
updateManyMembers(data: MemberUpdateManyMutationInput!, where: MemberWhereInput): BatchPayload!
|
||||
@@ -1254,7 +1415,12 @@ type Query {
|
||||
teamMembers(where: TeamMembersWhereUniqueInput!): TeamMembers
|
||||
member(where: MemberWhereUniqueInput!): Member
|
||||
financialBeings(where: FinancialBeingsWhereUniqueInput!): FinancialBeings
|
||||
teamProfile(where: TeamProfileWhereUniqueInput!): TeamProfile
|
||||
wallet(where: WalletWhereUniqueInput!): Wallet
|
||||
memberStatus(where: MemberStatusWhereUniqueInput!): MemberStatus
|
||||
fBStatus(where: FBStatusWhereUniqueInput!): FBStatus
|
||||
teamMemberStatus(where: TeamMemberStatusWhereUniqueInput!): TeamMemberStatus
|
||||
teamStatus(where: TeamStatusWhereUniqueInput!): TeamStatus
|
||||
teamsConnection(where: TeamWhereInput, orderBy: TeamOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): TeamConnection!
|
||||
teamMembersesConnection(where: TeamMembersWhereInput, orderBy: TeamMembersOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): TeamMembersConnection!
|
||||
membersConnection(where: MemberWhereInput, orderBy: MemberOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): MemberConnection!
|
||||
@@ -1311,6 +1477,7 @@ type Team implements Node {
|
||||
fb(where: FinancialBeingsWhereInput, orderBy: FinancialBeingsOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [FinancialBeings!]
|
||||
status(where: TeamStatusWhereInput, orderBy: TeamStatusOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [TeamStatus!]
|
||||
createdAt: DateTime!
|
||||
updatedAt: DateTime!
|
||||
}
|
||||
|
||||
"""A connection to a list of items."""
|
||||
@@ -1995,9 +2162,11 @@ type TeamPreviousValues {
|
||||
slug: String!
|
||||
owner: String!
|
||||
createdAt: DateTime!
|
||||
updatedAt: DateTime!
|
||||
}
|
||||
|
||||
type TeamProfile {
|
||||
type TeamProfile implements Node {
|
||||
id: ID!
|
||||
description: String
|
||||
motto: String
|
||||
avatar: String
|
||||
@@ -2025,6 +2194,7 @@ input TeamProfileCreateInput {
|
||||
|
||||
input TeamProfileCreateOneInput {
|
||||
create: TeamProfileCreateInput
|
||||
connect: TeamProfileWhereUniqueInput
|
||||
}
|
||||
|
||||
"""An edge in a connection."""
|
||||
@@ -2037,6 +2207,8 @@ type TeamProfileEdge {
|
||||
}
|
||||
|
||||
enum TeamProfileOrderByInput {
|
||||
id_ASC
|
||||
id_DESC
|
||||
description_ASC
|
||||
description_DESC
|
||||
motto_ASC
|
||||
@@ -2049,11 +2221,10 @@ enum TeamProfileOrderByInput {
|
||||
updatedAt_DESC
|
||||
createdAt_ASC
|
||||
createdAt_DESC
|
||||
id_ASC
|
||||
id_DESC
|
||||
}
|
||||
|
||||
type TeamProfilePreviousValues {
|
||||
id: ID!
|
||||
description: String
|
||||
motto: String
|
||||
avatar: String
|
||||
@@ -2108,6 +2279,13 @@ input TeamProfileUpdateDataInput {
|
||||
banner: String
|
||||
}
|
||||
|
||||
input TeamProfileUpdateInput {
|
||||
description: String
|
||||
motto: String
|
||||
avatar: String
|
||||
banner: String
|
||||
}
|
||||
|
||||
input TeamProfileUpdateManyMutationInput {
|
||||
description: String
|
||||
motto: String
|
||||
@@ -2117,6 +2295,7 @@ input TeamProfileUpdateManyMutationInput {
|
||||
|
||||
input TeamProfileUpdateOneInput {
|
||||
create: TeamProfileCreateInput
|
||||
connect: TeamProfileWhereUniqueInput
|
||||
disconnect: Boolean
|
||||
delete: Boolean
|
||||
update: TeamProfileUpdateDataInput
|
||||
@@ -2137,6 +2316,46 @@ input TeamProfileWhereInput {
|
||||
|
||||
"""Logical NOT on all given filters combined by AND."""
|
||||
NOT: [TeamProfileWhereInput!]
|
||||
id: ID
|
||||
|
||||
"""All values that are not equal to given value."""
|
||||
id_not: ID
|
||||
|
||||
"""All values that are contained in given list."""
|
||||
id_in: [ID!]
|
||||
|
||||
"""All values that are not contained in given list."""
|
||||
id_not_in: [ID!]
|
||||
|
||||
"""All values less than the given value."""
|
||||
id_lt: ID
|
||||
|
||||
"""All values less than or equal the given value."""
|
||||
id_lte: ID
|
||||
|
||||
"""All values greater than the given value."""
|
||||
id_gt: ID
|
||||
|
||||
"""All values greater than or equal the given value."""
|
||||
id_gte: ID
|
||||
|
||||
"""All values containing the given string."""
|
||||
id_contains: ID
|
||||
|
||||
"""All values not containing the given string."""
|
||||
id_not_contains: ID
|
||||
|
||||
"""All values starting with the given string."""
|
||||
id_starts_with: ID
|
||||
|
||||
"""All values not starting with the given string."""
|
||||
id_not_starts_with: ID
|
||||
|
||||
"""All values ending with the given string."""
|
||||
id_ends_with: ID
|
||||
|
||||
"""All values not ending with the given string."""
|
||||
id_not_ends_with: ID
|
||||
description: String
|
||||
|
||||
"""All values that are not equal to given value."""
|
||||
@@ -2343,7 +2562,12 @@ input TeamProfileWhereInput {
|
||||
createdAt_gte: DateTime
|
||||
}
|
||||
|
||||
type TeamStatus {
|
||||
input TeamProfileWhereUniqueInput {
|
||||
id: ID
|
||||
}
|
||||
|
||||
type TeamStatus implements Node {
|
||||
id: ID!
|
||||
status: Status
|
||||
reason: String
|
||||
createdAt: DateTime!
|
||||
@@ -2366,6 +2590,7 @@ input TeamStatusCreateInput {
|
||||
|
||||
input TeamStatusCreateManyInput {
|
||||
create: [TeamStatusCreateInput!]
|
||||
connect: [TeamStatusWhereUniqueInput!]
|
||||
}
|
||||
|
||||
"""An edge in a connection."""
|
||||
@@ -2378,19 +2603,20 @@ type TeamStatusEdge {
|
||||
}
|
||||
|
||||
enum TeamStatusOrderByInput {
|
||||
id_ASC
|
||||
id_DESC
|
||||
status_ASC
|
||||
status_DESC
|
||||
reason_ASC
|
||||
reason_DESC
|
||||
createdAt_ASC
|
||||
createdAt_DESC
|
||||
id_ASC
|
||||
id_DESC
|
||||
updatedAt_ASC
|
||||
updatedAt_DESC
|
||||
}
|
||||
|
||||
type TeamStatusPreviousValues {
|
||||
id: ID!
|
||||
status: Status
|
||||
reason: String
|
||||
createdAt: DateTime!
|
||||
@@ -2435,8 +2661,23 @@ input TeamStatusSubscriptionWhereInput {
|
||||
node: TeamStatusWhereInput
|
||||
}
|
||||
|
||||
input TeamStatusUpdateDataInput {
|
||||
status: Status
|
||||
reason: String
|
||||
}
|
||||
|
||||
input TeamStatusUpdateInput {
|
||||
status: Status
|
||||
reason: String
|
||||
}
|
||||
|
||||
input TeamStatusUpdateManyInput {
|
||||
create: [TeamStatusCreateInput!]
|
||||
connect: [TeamStatusWhereUniqueInput!]
|
||||
disconnect: [TeamStatusWhereUniqueInput!]
|
||||
delete: [TeamStatusWhereUniqueInput!]
|
||||
update: [TeamStatusUpdateWithWhereUniqueNestedInput!]
|
||||
upsert: [TeamStatusUpsertWithWhereUniqueNestedInput!]
|
||||
}
|
||||
|
||||
input TeamStatusUpdateManyMutationInput {
|
||||
@@ -2444,6 +2685,17 @@ input TeamStatusUpdateManyMutationInput {
|
||||
reason: String
|
||||
}
|
||||
|
||||
input TeamStatusUpdateWithWhereUniqueNestedInput {
|
||||
where: TeamStatusWhereUniqueInput!
|
||||
data: TeamStatusUpdateDataInput!
|
||||
}
|
||||
|
||||
input TeamStatusUpsertWithWhereUniqueNestedInput {
|
||||
where: TeamStatusWhereUniqueInput!
|
||||
update: TeamStatusUpdateDataInput!
|
||||
create: TeamStatusCreateInput!
|
||||
}
|
||||
|
||||
input TeamStatusWhereInput {
|
||||
"""Logical AND on all given filters."""
|
||||
AND: [TeamStatusWhereInput!]
|
||||
@@ -2453,6 +2705,46 @@ input TeamStatusWhereInput {
|
||||
|
||||
"""Logical NOT on all given filters combined by AND."""
|
||||
NOT: [TeamStatusWhereInput!]
|
||||
id: ID
|
||||
|
||||
"""All values that are not equal to given value."""
|
||||
id_not: ID
|
||||
|
||||
"""All values that are contained in given list."""
|
||||
id_in: [ID!]
|
||||
|
||||
"""All values that are not contained in given list."""
|
||||
id_not_in: [ID!]
|
||||
|
||||
"""All values less than the given value."""
|
||||
id_lt: ID
|
||||
|
||||
"""All values less than or equal the given value."""
|
||||
id_lte: ID
|
||||
|
||||
"""All values greater than the given value."""
|
||||
id_gt: ID
|
||||
|
||||
"""All values greater than or equal the given value."""
|
||||
id_gte: ID
|
||||
|
||||
"""All values containing the given string."""
|
||||
id_contains: ID
|
||||
|
||||
"""All values not containing the given string."""
|
||||
id_not_contains: ID
|
||||
|
||||
"""All values starting with the given string."""
|
||||
id_starts_with: ID
|
||||
|
||||
"""All values not starting with the given string."""
|
||||
id_not_starts_with: ID
|
||||
|
||||
"""All values ending with the given string."""
|
||||
id_ends_with: ID
|
||||
|
||||
"""All values not ending with the given string."""
|
||||
id_not_ends_with: ID
|
||||
status: Status
|
||||
|
||||
"""All values that are not equal to given value."""
|
||||
@@ -2527,6 +2819,10 @@ input TeamStatusWhereInput {
|
||||
createdAt_gte: DateTime
|
||||
}
|
||||
|
||||
input TeamStatusWhereUniqueInput {
|
||||
id: ID
|
||||
}
|
||||
|
||||
type TeamSubscriptionPayload {
|
||||
mutation: MutationType!
|
||||
node: Team
|
||||
@@ -2822,6 +3118,28 @@ input TeamWhereInput {
|
||||
|
||||
"""All values greater than or equal the given value."""
|
||||
createdAt_gte: DateTime
|
||||
updatedAt: DateTime
|
||||
|
||||
"""All values that are not equal to given value."""
|
||||
updatedAt_not: DateTime
|
||||
|
||||
"""All values that are contained in given list."""
|
||||
updatedAt_in: [DateTime!]
|
||||
|
||||
"""All values that are not contained in given list."""
|
||||
updatedAt_not_in: [DateTime!]
|
||||
|
||||
"""All values less than the given value."""
|
||||
updatedAt_lt: DateTime
|
||||
|
||||
"""All values less than or equal the given value."""
|
||||
updatedAt_lte: DateTime
|
||||
|
||||
"""All values greater than the given value."""
|
||||
updatedAt_gt: DateTime
|
||||
|
||||
"""All values greater than or equal the given value."""
|
||||
updatedAt_gte: DateTime
|
||||
profile: TeamProfileWhereInput
|
||||
members_every: TeamMembersWhereInput
|
||||
members_some: TeamMembersWhereInput
|
||||
@@ -2841,7 +3159,8 @@ input TeamWhereUniqueInput {
|
||||
slug: String
|
||||
}
|
||||
|
||||
type Wallet {
|
||||
type Wallet implements Node {
|
||||
id: ID!
|
||||
balance: Float
|
||||
updatedAt: DateTime!
|
||||
}
|
||||
@@ -2862,6 +3181,7 @@ input WalletCreateInput {
|
||||
|
||||
input WalletCreateOneInput {
|
||||
create: WalletCreateInput
|
||||
connect: WalletWhereUniqueInput
|
||||
}
|
||||
|
||||
"""An edge in a connection."""
|
||||
@@ -2874,17 +3194,18 @@ type WalletEdge {
|
||||
}
|
||||
|
||||
enum WalletOrderByInput {
|
||||
id_ASC
|
||||
id_DESC
|
||||
balance_ASC
|
||||
balance_DESC
|
||||
updatedAt_ASC
|
||||
updatedAt_DESC
|
||||
id_ASC
|
||||
id_DESC
|
||||
createdAt_ASC
|
||||
createdAt_DESC
|
||||
}
|
||||
|
||||
type WalletPreviousValues {
|
||||
id: ID!
|
||||
balance: Float
|
||||
updatedAt: DateTime!
|
||||
}
|
||||
@@ -2932,12 +3253,17 @@ input WalletUpdateDataInput {
|
||||
balance: Float
|
||||
}
|
||||
|
||||
input WalletUpdateInput {
|
||||
balance: Float
|
||||
}
|
||||
|
||||
input WalletUpdateManyMutationInput {
|
||||
balance: Float
|
||||
}
|
||||
|
||||
input WalletUpdateOneInput {
|
||||
create: WalletCreateInput
|
||||
connect: WalletWhereUniqueInput
|
||||
disconnect: Boolean
|
||||
delete: Boolean
|
||||
update: WalletUpdateDataInput
|
||||
@@ -2958,6 +3284,46 @@ input WalletWhereInput {
|
||||
|
||||
"""Logical NOT on all given filters combined by AND."""
|
||||
NOT: [WalletWhereInput!]
|
||||
id: ID
|
||||
|
||||
"""All values that are not equal to given value."""
|
||||
id_not: ID
|
||||
|
||||
"""All values that are contained in given list."""
|
||||
id_in: [ID!]
|
||||
|
||||
"""All values that are not contained in given list."""
|
||||
id_not_in: [ID!]
|
||||
|
||||
"""All values less than the given value."""
|
||||
id_lt: ID
|
||||
|
||||
"""All values less than or equal the given value."""
|
||||
id_lte: ID
|
||||
|
||||
"""All values greater than the given value."""
|
||||
id_gt: ID
|
||||
|
||||
"""All values greater than or equal the given value."""
|
||||
id_gte: ID
|
||||
|
||||
"""All values containing the given string."""
|
||||
id_contains: ID
|
||||
|
||||
"""All values not containing the given string."""
|
||||
id_not_contains: ID
|
||||
|
||||
"""All values starting with the given string."""
|
||||
id_starts_with: ID
|
||||
|
||||
"""All values not starting with the given string."""
|
||||
id_not_starts_with: ID
|
||||
|
||||
"""All values ending with the given string."""
|
||||
id_ends_with: ID
|
||||
|
||||
"""All values not ending with the given string."""
|
||||
id_not_ends_with: ID
|
||||
balance: Float
|
||||
|
||||
"""All values that are not equal to given value."""
|
||||
@@ -3003,3 +3369,7 @@ input WalletWhereInput {
|
||||
"""All values greater than or equal the given value."""
|
||||
updatedAt_gte: DateTime
|
||||
}
|
||||
|
||||
input WalletWhereUniqueInput {
|
||||
id: ID
|
||||
}
|
||||
@@ -3,7 +3,7 @@ import { ApolloError } from 'apollo-server-express'
|
||||
|
||||
import { getUser } from '../../../middleware/getMember'
|
||||
|
||||
import { sendTeamMemberInvite, sendTeamCreateConfirmation, verifyInviteToken } from '../../../email/sendgrid'
|
||||
import { notifications_sendTeamCreateConfirmation, notifications_sendTeamMemberInvite, notifications_VerifyTeamMemberInviteToken } from '../notifications/sendgrid'
|
||||
|
||||
import TEAMS_CONNECTIONS_FRAGMENT from '../../fragments/TeamsConnectionsFragment'
|
||||
import TEAMS_FRAGMENT from '../../fragments/TeamsFragment'
|
||||
@@ -20,14 +20,14 @@ export const resolvers = {
|
||||
create:{role:'MEMBER', email:email, team: {connect: {id: teamId}}, status:{create:{status: 'INVITED', reason: `Invited by ${team.members[0].member.alias}`}}},
|
||||
update:{role: 'MEMBER', email: email, team: {connect: {id: teamId}}, status:{create:{status: 'INVITED', reason: `Invite resent by ${team.members[0].member.alias}`}}}},
|
||||
`{ id }`)
|
||||
const sendInvite = await sendTeamMemberInvite(email, team)
|
||||
const sendInvite = await notifications_sendTeamMemberInvite(email, team)
|
||||
return sendInvite
|
||||
},
|
||||
async verifyTeamInvite(parent, { token }, ctx, info) {
|
||||
let verifiedToken = null
|
||||
let team = null
|
||||
try {
|
||||
verifiedToken = await verifyInviteToken(token)
|
||||
verifiedToken = await notifications_VerifyTeamMemberInviteToken(token)
|
||||
team = {
|
||||
email: verifiedToken.email,
|
||||
team: {
|
||||
@@ -53,18 +53,17 @@ export const resolvers = {
|
||||
logger.info(JSON.stringify(await userData))
|
||||
const alias = await userData.data.users_User.alias
|
||||
const email = await userData.data.users_User.email
|
||||
const avatar = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
const banner = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-banner-default.png'
|
||||
const avatar = process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
const banner = process.env.STORAGE_URL + '/module-teams/module-default/aa-banner-default.png'
|
||||
|
||||
const createTeamUrl = encodeURI(`${slug}/${name}/${alias}/${botSlug}/${botName}`)
|
||||
logger.info('createTeamUrl:')
|
||||
logger.info(JSON.stringify(await createTeamUrl))
|
||||
|
||||
const platformUrl = 'https://charts-dev.advancedalgos.net/AABrowserAPI/newTeam/'
|
||||
// const platformUrl = 'http://localhost:1337/AABrowserAPI/teamSetup/'
|
||||
const chartsUrl = process.env.CHARTS_URL + '/AABrowserAPI/newTeam/'
|
||||
|
||||
logger.info(`${platformUrl}${createTeamUrl}/${authId}`)
|
||||
const createPlatformTeam = await axios.get(`${platformUrl}${createTeamUrl}/${authId}/${process.env.AAWEB_TEAM_SHARED_SECRET}`)
|
||||
logger.info(`${chartsUrl}${createTeamUrl}/${authId}`)
|
||||
const createPlatformTeam = await axios.get(`${chartsUrl}${createTeamUrl}/${authId}/${process.env.AAWEB_TEAM_SHARED_SECRET}`)
|
||||
.then((result) => {
|
||||
console.log('createPlatformTeam result:', result.data)
|
||||
if(result.data.message === 'Team Name already taken'){
|
||||
@@ -112,7 +111,7 @@ export const resolvers = {
|
||||
})
|
||||
}
|
||||
|
||||
sendTeamCreateConfirmation(email, name, botName)
|
||||
notifications_sendTeamCreateConfirmation(email, name, botName)
|
||||
|
||||
return createTeam
|
||||
},
|
||||
@@ -152,11 +151,10 @@ export const resolvers = {
|
||||
logger.info('deleteTeamUrl:')
|
||||
logger.info(JSON.stringify(await deleteTeamUrl))
|
||||
|
||||
const platformUrl = 'https://charts-dev.advancedalgos.net/AABrowserAPI/deleteTeam/'
|
||||
// const platformUrl = 'http://localhost:1337/AABrowserAPI/teamSetup/'
|
||||
const chartsUrl = process.env.CHARTS_URL + '/AABrowserAPI/deleteTeam/'
|
||||
|
||||
logger.info(`${platformUrl}${deleteTeamUrl}/${authId}`)
|
||||
const deletePlatformTeam = await axios.get(`${platformUrl}${deleteTeamUrl}/${authId}/${process.env.AAWEB_DELETE_TEAM_SHARED_SECRET}`)
|
||||
logger.info(`${chartsUrl}${deleteTeamUrl}/${authId}`)
|
||||
const deletePlatformTeam = await axios.get(`${chartsUrl}${deleteTeamUrl}/${authId}/${process.env.AAWEB_DELETE_TEAM_SHARED_SECRET}`)
|
||||
.then((result) => {
|
||||
console.log('deletePlatformTeam result:', result.data)
|
||||
if(result.data.result === 'Fail'){
|
||||
|
||||
@@ -36,7 +36,7 @@ export const teamsByOwner = async (parent, args, ctx, info) => {
|
||||
throw new AuthenticationError()
|
||||
return
|
||||
}
|
||||
return ctx.db.query.teams({where: { owner: authId }, orderBy:'updatedAt_DESC'}, TEAMS_FRAGMENT)
|
||||
return ctx.db.query.teams({where: { owner: authId }, orderBy:'createdAt_DESC'}, TEAMS_FRAGMENT)
|
||||
}
|
||||
|
||||
export const teamsByRole = async (parent, args, ctx, info) => {
|
||||
|
||||
@@ -8,7 +8,7 @@ export const fbByTeamMember = async (parent, args, ctx, info) => {
|
||||
if (!authId) {
|
||||
throw new AuthenticationError()
|
||||
}
|
||||
let teamMemberFB = await ctx.db.query.teams({where: {members_some: {AND: [{member: {authId: authId}}]}}, orderBy: 'updatedAt_DESC'}, TEAM_FB_FRAGMENT)
|
||||
let teamMemberFB = await ctx.db.query.teams({where: {members_some: {AND: [{member: {authId: authId}}]}}, orderBy: 'createdAt_DESC'}, TEAM_FB_FRAGMENT)
|
||||
logger.info('fbByTeamMember response: ', await teamMemberFB[0])
|
||||
return teamMemberFB[0]
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
var jwt = require('jsonwebtoken')
|
||||
var axios = require('axios')
|
||||
|
||||
import { logger } from '../logger'
|
||||
|
||||
export const notifications_sendTeamMemberInvite = (email, team) => {
|
||||
logger.info('notifications_sendTeamMemberInvite')
|
||||
logger.info(email)
|
||||
logger.info(teamName)
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
return axios.post(process.env.PLATFORM_API_URL, {
|
||||
query: `mutation notifications_Teams_SendTeamMemberInvite($email:String!, $teamName:String!){
|
||||
notifications_Teams_SendTeamMemberInvite(email:$email, teamName:$teamName)
|
||||
}`,
|
||||
variables: {
|
||||
email: email,
|
||||
teamName: team.name
|
||||
}
|
||||
}, {
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
})
|
||||
.then(res => {
|
||||
logger.info('sendTeamMemberInvite result')
|
||||
logger.info(res.data)
|
||||
resolve(res.data)
|
||||
})
|
||||
.catch(err => {
|
||||
logger.info('sendTeamMemberInvite err')
|
||||
logger.info(err)
|
||||
reject(err)
|
||||
})
|
||||
} catch (error) {
|
||||
reject(error)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export const notifications_sendTeamCreateConfirmation = (email, teamName, botName) => {
|
||||
logger.info('notifications_sendTeamCreateConfirmation')
|
||||
logger.info(email)
|
||||
logger.info(teamName)
|
||||
logger.info(botName)
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
return axios.post(process.env.PLATFORM_API_URL, {
|
||||
query: `mutation notifications_sendTeamCreateConfirmation($email: String!, $teamName: String!, $botName: String!){
|
||||
notifications_Teams_SendTeamCreateConfirmation(email: $email, teamName: $teamName, botName: $botName)
|
||||
}`,
|
||||
variables: {
|
||||
email: email,
|
||||
teamName: teamName,
|
||||
botName: botName
|
||||
}
|
||||
}, {
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
})
|
||||
.then(res => {
|
||||
logger.info('sendTeamCreateConfirmation result')
|
||||
logger.info(res.data)
|
||||
resolve(res.data)
|
||||
})
|
||||
.catch(err => {
|
||||
logger.info('sendTeamCreateConfirmation err')
|
||||
logger.info(err)
|
||||
reject(err)
|
||||
})
|
||||
} catch (error) {
|
||||
reject(error)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export const notifications_VerifyTeamMemberInviteToken = (token) => {
|
||||
logger.info('notifications_VerifyTeamMemberInviteToken')
|
||||
logger.info(token)
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
return axios.post(process.env.PLATFORM_API_URL, {
|
||||
query: `mutation notifications_VerifyTeamMemberInviteToken($token: String!){
|
||||
notifications_Teams_VerifyTeamMemberInviteToken(token: $token)
|
||||
}`,
|
||||
variables: {
|
||||
token: token
|
||||
}
|
||||
}, {
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
})
|
||||
.then(res => {
|
||||
logger.info('VerifyTeamMemberInviteToken result')
|
||||
logger.info(res.data)
|
||||
resolve(res.data)
|
||||
})
|
||||
.catch(err => {
|
||||
logger.info('VerifyTeamMemberInviteToken err')
|
||||
logger.info(err)
|
||||
reject(err)
|
||||
})
|
||||
} catch (error) {
|
||||
reject(error)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const verifyInviteToken = async function(token) {
|
||||
const API_KEY = process.env.SG_APIKEY
|
||||
let verifiedToken
|
||||
try {
|
||||
verifiedToken = await jwt.verify(token, API_KEY, {maxAge: '7d'})
|
||||
} catch(err) {
|
||||
if (err.name === "TokenExpiredError"){
|
||||
throw new Error ("Error: Token Expired. Please request new invitation or apply to the team again")
|
||||
} else {
|
||||
throw new Error (`Error: Token error - ${err.message}`)
|
||||
}
|
||||
}
|
||||
logger.info(`verifyInviteToken: ${verifiedToken}`)
|
||||
return verifiedToken
|
||||
}
|
||||
|
||||
module.exports = { sendTeamMemberInvite, sendTeamCreateConfirmation, verifyInviteToken }
|
||||
@@ -19,10 +19,9 @@ export const getMember = async (req, res, next, db) => {
|
||||
export const getUser = authId => {
|
||||
logger.info('getUser MiddleWare')
|
||||
logger.info(authId)
|
||||
const API_URL = 'https://app-api.advancedalgos.net/graphql'
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
return axios.post(API_URL, {
|
||||
return axios.post(process.env.PLATFORM_API_URL, {
|
||||
query: `query users_User($userId: ID!) {
|
||||
users_User(id: $userId){
|
||||
id
|
||||
|
||||
Generated
+202
-153
@@ -1,28 +1,30 @@
|
||||
{
|
||||
"name": "@advancedalgos/teams-client",
|
||||
"version": "0.0.27",
|
||||
"version": "0.0.31",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@advancedalgos/web-components": {
|
||||
"version": "0.0.15",
|
||||
"resolved": "https://registry.npmjs.org/@advancedalgos/web-components/-/web-components-0.0.15.tgz",
|
||||
"integrity": "sha512-Z9QyMqgpR/Al+0EYuLtSK3/9BJ/anB0zulBG7QMac9xCgNGSSbon9GndtSIFN3HwyirDCsIH3CZdPi6tJL3KnA==",
|
||||
"version": "0.0.17",
|
||||
"resolved": "https://registry.npmjs.org/@advancedalgos/web-components/-/web-components-0.0.17.tgz",
|
||||
"integrity": "sha512-xD+0E4XBltgIxH/9TkzMS6a6iz7973YjxOzEr2O/D93lGIeHaYJQTDwykOLtSocuSaSSYRzxFlf82pVh22wLIA==",
|
||||
"requires": {
|
||||
"@azure/storage-blob": "^10.1.0-preview",
|
||||
"@material-ui/core": "^3.2.2",
|
||||
"@bearcanrun/react-image-cropper": "^1.3.6",
|
||||
"@material-ui/core": "^3.6.1",
|
||||
"@material-ui/icons": "^3.0.1",
|
||||
"apollo-client": "^2.4.5",
|
||||
"apollo-client": "^2.4.7",
|
||||
"blob-util": "^2.0.2",
|
||||
"browser-image-resizer": "^1.2.0",
|
||||
"graphql": "^14.0.2",
|
||||
"graphql-tag": "^2.10.0",
|
||||
"prop-types": "^15.6.2",
|
||||
"react": "^16.6.1",
|
||||
"react-apollo": "^2.3.1",
|
||||
"react-apollo": "^2.3.2",
|
||||
"react-dom": "^16.6.1",
|
||||
"react-dropzone": "^5.1.0",
|
||||
"react-image-cropper": "^1.3.0"
|
||||
"react-helmet": "^5.2.0",
|
||||
"react-router-dom": "^4.3.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@azure/storage-blob": {
|
||||
@@ -42,37 +44,37 @@
|
||||
"optional": true
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "9.6.39",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.39.tgz",
|
||||
"integrity": "sha512-c3OkjgNpSMdHan56WhklP0FMOk5ocilKz2Mpa0NOGzu8jw5YERjCf9FG0epYB1+TxScv/oI4uJ204u2mUg7Hcw=="
|
||||
"version": "9.6.40",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.40.tgz",
|
||||
"integrity": "sha512-M3HHoXXndsho/sTbQML2BJr7/uwNhMg8P0D4lb+UsM65JQZx268faiz9hKpY4FpocWqpwlLwa8vevw8hLtKjOw=="
|
||||
},
|
||||
"apollo-cache": {
|
||||
"version": "1.1.20",
|
||||
"resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.1.20.tgz",
|
||||
"integrity": "sha512-+Du0/4kUSuf5PjPx0+pvgMGV12ezbHA8/hubYuqRQoy/4AWb4faa61CgJNI6cKz2mhDd9m94VTNKTX11NntwkQ==",
|
||||
"version": "1.1.21",
|
||||
"resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.1.21.tgz",
|
||||
"integrity": "sha512-5ErNb78KHtrJNimkDBTEigcvHkIqUmS7QJIk4lpZZ+XLVVgvk2fD+GhD1PLP+s8vHfAKVbO6vdbRxCCjGGrh5w==",
|
||||
"requires": {
|
||||
"apollo-utilities": "^1.0.25"
|
||||
"apollo-utilities": "^1.0.26"
|
||||
}
|
||||
},
|
||||
"apollo-client": {
|
||||
"version": "2.4.5",
|
||||
"resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.4.5.tgz",
|
||||
"integrity": "sha512-nUm06EGa4TP/IY68OzmC3lTD32TqkjLOQdb69uYo+lHl8NnwebtrAw3qFtsQtTEz6ueBp/Z/HasNZng4jwafVQ==",
|
||||
"version": "2.4.7",
|
||||
"resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.4.7.tgz",
|
||||
"integrity": "sha512-6aAm+16AFBYZhJF8eKxrup6AbYni01InDiwTfZhMMTP2xaXQWjsQnfaHbI2oE+hd3+AZFy1drkse8RZKghR/WQ==",
|
||||
"requires": {
|
||||
"@types/async": "2.0.50",
|
||||
"@types/zen-observable": "^0.8.0",
|
||||
"apollo-cache": "1.1.20",
|
||||
"apollo-cache": "1.1.21",
|
||||
"apollo-link": "^1.0.0",
|
||||
"apollo-link-dedup": "^1.0.0",
|
||||
"apollo-utilities": "1.0.25",
|
||||
"apollo-utilities": "1.0.26",
|
||||
"symbol-observable": "^1.0.2",
|
||||
"zen-observable": "^0.8.0"
|
||||
}
|
||||
},
|
||||
"apollo-utilities": {
|
||||
"version": "1.0.25",
|
||||
"resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.25.tgz",
|
||||
"integrity": "sha512-AXvqkhni3Ir1ffm4SA1QzXn8k8I5BBl4PVKEyak734i4jFdp+xgfUyi2VCqF64TJlFTA/B73TRDUvO2D+tKtZg==",
|
||||
"version": "1.0.26",
|
||||
"resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.26.tgz",
|
||||
"integrity": "sha512-URw7o3phymliqYCYatcird2YRPUU2eWCNvip64U9gQrX56mEfK4m99yBIDCMTpmcvOFsKLii1sIEZsHIs/bvnw==",
|
||||
"requires": {
|
||||
"fast-json-stable-stringify": "^2.0.0"
|
||||
}
|
||||
@@ -98,9 +100,9 @@
|
||||
}
|
||||
},
|
||||
"hoist-non-react-statics": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.1.0.tgz",
|
||||
"integrity": "sha512-MYcYuROh7SBM69xHGqXEwQqDux34s9tz+sCnxJmN18kgWh6JFdTw/5YdZtqsOdZJXddE/wUpCzfEdDrJj8p0Iw==",
|
||||
"version": "3.2.1",
|
||||
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.2.1.tgz",
|
||||
"integrity": "sha512-TFsu3TV3YLY+zFTZDrN8L2DTFanObwmBLpWvJs1qfUuEQ5bTAdFcwfx2T/bsCXfM9QHSLvjfP+nihEl0yvozxw==",
|
||||
"requires": {
|
||||
"react-is": "^16.3.2"
|
||||
}
|
||||
@@ -122,10 +124,15 @@
|
||||
"xml2js": "^0.4.19"
|
||||
}
|
||||
},
|
||||
"punycode": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
|
||||
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
|
||||
},
|
||||
"react-apollo": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/react-apollo/-/react-apollo-2.3.1.tgz",
|
||||
"integrity": "sha512-xPteQmCzMJT8wE4v0zq38E6JWLhrNcJENl66fP117lwzU2lZA+qoUDcizqKl0z2OY5b+KklmqnPPD+wcWAdy7w==",
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/react-apollo/-/react-apollo-2.3.2.tgz",
|
||||
"integrity": "sha512-3lU9iqmj4KMIZvlWWSuLihxMGLEAL6oNmnSTWrb3/mRP36Zy0zJD4rdaonDx4WzqFYQAnUPaOiFnHGp0UQUTwA==",
|
||||
"requires": {
|
||||
"fbjs": "^1.0.0",
|
||||
"hoist-non-react-statics": "^3.0.0",
|
||||
@@ -141,12 +148,12 @@
|
||||
"integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
|
||||
},
|
||||
"tough-cookie": {
|
||||
"version": "2.4.3",
|
||||
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
|
||||
"integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
|
||||
"version": "2.5.0",
|
||||
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
|
||||
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
|
||||
"requires": {
|
||||
"psl": "^1.1.24",
|
||||
"punycode": "^1.4.1"
|
||||
"psl": "^1.1.28",
|
||||
"punycode": "^2.1.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2071,10 +2078,97 @@
|
||||
"to-fast-properties": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"@bearcanrun/react-image-cropper": {
|
||||
"version": "1.3.6",
|
||||
"resolved": "https://registry.npmjs.org/@bearcanrun/react-image-cropper/-/react-image-cropper-1.3.6.tgz",
|
||||
"integrity": "sha512-/6F2rNd/bNR7jB/Pxhan1T6KDF+CHl9hEeybumtOyZrYc2foxawMNjxgD4MW0Z3Wh6GxZKDM9dlsxaaC+/y0Zg==",
|
||||
"requires": {
|
||||
"deep-extend": "^0.6.0",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"prop-types": "15.6.0",
|
||||
"react": "16.5.2",
|
||||
"react-dom": "16.5.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"core-js": {
|
||||
"version": "1.2.7",
|
||||
"resolved": "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
|
||||
"integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
|
||||
},
|
||||
"fbjs": {
|
||||
"version": "0.8.17",
|
||||
"resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz",
|
||||
"integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=",
|
||||
"requires": {
|
||||
"core-js": "^1.0.0",
|
||||
"isomorphic-fetch": "^2.1.1",
|
||||
"loose-envify": "^1.0.0",
|
||||
"object-assign": "^4.1.0",
|
||||
"promise": "^7.1.1",
|
||||
"setimmediate": "^1.0.5",
|
||||
"ua-parser-js": "^0.7.18"
|
||||
}
|
||||
},
|
||||
"prop-types": {
|
||||
"version": "15.6.0",
|
||||
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz",
|
||||
"integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=",
|
||||
"requires": {
|
||||
"fbjs": "^0.8.16",
|
||||
"loose-envify": "^1.3.1",
|
||||
"object-assign": "^4.1.1"
|
||||
}
|
||||
},
|
||||
"react": {
|
||||
"version": "16.5.2",
|
||||
"resolved": "https://registry.npmjs.org/react/-/react-16.5.2.tgz",
|
||||
"integrity": "sha512-FDCSVd3DjVTmbEAjUNX6FgfAmQ+ypJfHUsqUJOYNCBUp1h8lqmtC+0mXJ+JjsWx4KAVTkk1vKd1hLQPvEviSuw==",
|
||||
"requires": {
|
||||
"loose-envify": "^1.1.0",
|
||||
"object-assign": "^4.1.1",
|
||||
"prop-types": "^15.6.2",
|
||||
"schedule": "^0.5.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"prop-types": {
|
||||
"version": "15.6.2",
|
||||
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz",
|
||||
"integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==",
|
||||
"requires": {
|
||||
"loose-envify": "^1.3.1",
|
||||
"object-assign": "^4.1.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"react-dom": {
|
||||
"version": "16.5.2",
|
||||
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.5.2.tgz",
|
||||
"integrity": "sha512-RC8LDw8feuZOHVgzEf7f+cxBr/DnKdqp56VU0lAs1f4UfKc4cU8wU4fTq/mgnvynLQo8OtlPC19NUFh/zjZPuA==",
|
||||
"requires": {
|
||||
"loose-envify": "^1.1.0",
|
||||
"object-assign": "^4.1.1",
|
||||
"prop-types": "^15.6.2",
|
||||
"schedule": "^0.5.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"prop-types": {
|
||||
"version": "15.6.2",
|
||||
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz",
|
||||
"integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==",
|
||||
"requires": {
|
||||
"loose-envify": "^1.3.1",
|
||||
"object-assign": "^4.1.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"@material-ui/core": {
|
||||
"version": "3.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@material-ui/core/-/core-3.5.1.tgz",
|
||||
"integrity": "sha512-yMBwYV5HQ/kZjncSmzHSx4uxJCePdbq9N58Jl0tq9D1gD5fKVJY/lItnQLRlcpCzZUkGxfDhpDutvLDq58ZAkg==",
|
||||
"version": "3.6.1",
|
||||
"resolved": "https://registry.npmjs.org/@material-ui/core/-/core-3.6.1.tgz",
|
||||
"integrity": "sha512-jmDtLQVXYHzvv6TljspaoHazGXkgmgnLUosFateBdB3Vva6WVJZ7WY5LaAGOqtuTEUW6KUKDumaGoOQs4xuJWA==",
|
||||
"requires": {
|
||||
"@babel/runtime": "7.1.2",
|
||||
"@material-ui/utils": "^3.0.0-alpha.0",
|
||||
@@ -2114,9 +2208,9 @@
|
||||
}
|
||||
},
|
||||
"hoist-non-react-statics": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.1.0.tgz",
|
||||
"integrity": "sha512-MYcYuROh7SBM69xHGqXEwQqDux34s9tz+sCnxJmN18kgWh6JFdTw/5YdZtqsOdZJXddE/wUpCzfEdDrJj8p0Iw==",
|
||||
"version": "3.2.1",
|
||||
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.2.1.tgz",
|
||||
"integrity": "sha512-TFsu3TV3YLY+zFTZDrN8L2DTFanObwmBLpWvJs1qfUuEQ5bTAdFcwfx2T/bsCXfM9QHSLvjfP+nihEl0yvozxw==",
|
||||
"requires": {
|
||||
"react-is": "^16.3.2"
|
||||
}
|
||||
@@ -2325,9 +2419,9 @@
|
||||
"integrity": "sha512-HtKGu+qG1NPvYe1z7ezLsyIaXYyi8SoAVqWDZgDQ8dLrsZvSzUNCwZyfX33uhWxL/SU0ZDQZ3nwZ0nimt507Kw=="
|
||||
},
|
||||
"@types/react": {
|
||||
"version": "16.7.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-16.7.6.tgz",
|
||||
"integrity": "sha512-QBUfzftr/8eg/q3ZRgf/GaDP6rTYc7ZNem+g4oZM38C9vXyV8AWRWaTQuW5yCoZTsfHrN7b3DeEiUnqH9SrnpA==",
|
||||
"version": "16.7.13",
|
||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-16.7.13.tgz",
|
||||
"integrity": "sha512-WhqrQLAE9z65hfcvWqZfR6qUtIazFRyb8LXqHo8440R53dAQqNkt2OlVJ3FXwqOwAXXg4nfYxt0qgBvE18o5XA==",
|
||||
"requires": {
|
||||
"@types/prop-types": "*",
|
||||
"csstype": "^2.2.0"
|
||||
@@ -5419,9 +5513,9 @@
|
||||
}
|
||||
},
|
||||
"csstype": {
|
||||
"version": "2.5.7",
|
||||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-2.5.7.tgz",
|
||||
"integrity": "sha512-Nt5VDyOTIIV4/nRFswoCKps1R5CD1hkiyjBE9/thNaNZILLEviVw9yWQw15+O+CpNjQKB/uvdcxFFOrSflY3Yw=="
|
||||
"version": "2.5.8",
|
||||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-2.5.8.tgz",
|
||||
"integrity": "sha512-r4DbsyNJ7slwBSKoGesxDubRWJ71ghG8W2+1HcsDlAo12KGca9dDLv0u98tfdFw7ldBdoA7XmCnI6Q8LpAJXaQ=="
|
||||
},
|
||||
"currently-unhandled": {
|
||||
"version": "0.4.1",
|
||||
@@ -5499,14 +5593,12 @@
|
||||
"deep-equal": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
|
||||
"integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
|
||||
"dev": true
|
||||
"integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU="
|
||||
},
|
||||
"deep-extend": {
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
|
||||
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
|
||||
"dev": true
|
||||
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
|
||||
},
|
||||
"deep-is": {
|
||||
"version": "0.1.3",
|
||||
@@ -5760,7 +5852,8 @@
|
||||
"duplexer": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
|
||||
"integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E="
|
||||
"integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
|
||||
"dev": true
|
||||
},
|
||||
"duplexer3": {
|
||||
"version": "0.1.4",
|
||||
@@ -6459,21 +6552,6 @@
|
||||
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
|
||||
"dev": true
|
||||
},
|
||||
"event-stream": {
|
||||
"version": "3.3.6",
|
||||
"resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.6.tgz",
|
||||
"integrity": "sha512-dGXNg4F/FgVzlApjzItL+7naHutA3fDqbV/zAZqDDlXTjiMnQmZKu+prImWKszeBM5UQeGvAl3u1wBiKeDh61g==",
|
||||
"requires": {
|
||||
"duplexer": "^0.1.1",
|
||||
"flatmap-stream": "^0.1.0",
|
||||
"from": "^0.1.7",
|
||||
"map-stream": "0.0.7",
|
||||
"pause-stream": "^0.0.11",
|
||||
"split": "^1.0.1",
|
||||
"stream-combiner": "^0.2.2",
|
||||
"through": "^2.3.8"
|
||||
}
|
||||
},
|
||||
"eventemitter3": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
|
||||
@@ -6510,6 +6588,11 @@
|
||||
"strip-eof": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"exenv": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz",
|
||||
"integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50="
|
||||
},
|
||||
"expand-brackets": {
|
||||
"version": "2.1.4",
|
||||
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
|
||||
@@ -6920,11 +7003,6 @@
|
||||
"write": "^0.2.1"
|
||||
}
|
||||
},
|
||||
"flatmap-stream": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "https://registry.npmjs.org/flatmap-stream/-/flatmap-stream-0.1.2.tgz",
|
||||
"integrity": "sha512-ucyr6WkLXjyMuHPtOUq4l+nSAxgWi7v4QO508eQ9resnGj+lSup26oIsUI5aH8k4Qfpjsxa8dDf9UCKkS2KHzQ=="
|
||||
},
|
||||
"flatten": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz",
|
||||
@@ -7002,11 +7080,6 @@
|
||||
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
|
||||
"dev": true
|
||||
},
|
||||
"from": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
|
||||
"integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4="
|
||||
},
|
||||
"from2": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
|
||||
@@ -8361,17 +8434,17 @@
|
||||
"dev": true
|
||||
},
|
||||
"indefinite-observable": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-1.0.1.tgz",
|
||||
"integrity": "sha1-CZFUI8yNb36xy3iCrRNGM8mm7cM=",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-1.0.2.tgz",
|
||||
"integrity": "sha512-Mps0898zEduHyPhb7UCgNmfzlqNZknVmaFz5qzr0mm04YQ5FGLhAyK/dJ+NaRxGyR6juQXIxh5Ev0xx+qq0nYA==",
|
||||
"requires": {
|
||||
"symbol-observable": "1.0.4"
|
||||
"symbol-observable": "1.2.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"symbol-observable": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz",
|
||||
"integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0="
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
|
||||
"integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -9570,11 +9643,6 @@
|
||||
"integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
|
||||
"dev": true
|
||||
},
|
||||
"map-stream": {
|
||||
"version": "0.0.7",
|
||||
"resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz",
|
||||
"integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg="
|
||||
},
|
||||
"map-visit": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
|
||||
@@ -10415,16 +10483,16 @@
|
||||
}
|
||||
},
|
||||
"npm-run-all": {
|
||||
"version": "4.1.3",
|
||||
"resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.3.tgz",
|
||||
"integrity": "sha512-aOG0N3Eo/WW+q6sUIdzcV2COS8VnTZCmdji0VQIAZF3b+a3YWb0AD0vFIyjKec18A7beLGbaQ5jFTNI2bPt9Cg==",
|
||||
"version": "4.1.5",
|
||||
"resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
|
||||
"integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
|
||||
"requires": {
|
||||
"ansi-styles": "^3.2.0",
|
||||
"chalk": "^2.1.0",
|
||||
"cross-spawn": "^6.0.4",
|
||||
"ansi-styles": "^3.2.1",
|
||||
"chalk": "^2.4.1",
|
||||
"cross-spawn": "^6.0.5",
|
||||
"memorystream": "^0.3.1",
|
||||
"minimatch": "^3.0.4",
|
||||
"ps-tree": "^1.1.0",
|
||||
"pidtree": "^0.3.0",
|
||||
"read-pkg": "^3.0.0",
|
||||
"shell-quote": "^1.6.1",
|
||||
"string.prototype.padend": "^3.0.0"
|
||||
@@ -10962,14 +11030,6 @@
|
||||
"pify": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"pause-stream": {
|
||||
"version": "0.0.11",
|
||||
"resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
|
||||
"integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
|
||||
"requires": {
|
||||
"through": "~2.3"
|
||||
}
|
||||
},
|
||||
"pbkdf2": {
|
||||
"version": "3.0.17",
|
||||
"resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
|
||||
@@ -10989,6 +11049,11 @@
|
||||
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
|
||||
"dev": true
|
||||
},
|
||||
"pidtree": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz",
|
||||
"integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg=="
|
||||
},
|
||||
"pify": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
|
||||
@@ -11026,9 +11091,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"popper.js": {
|
||||
"version": "1.14.5",
|
||||
"resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.5.tgz",
|
||||
"integrity": "sha512-fs4Sd8bZLgEzrk8aS7Em1qh+wcawtE87kRUJQhK6+LndyV1HerX7+LURzAylVaTyWIn5NTB/lyjnWqw/AZ6Yrw=="
|
||||
"version": "1.14.6",
|
||||
"resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.6.tgz",
|
||||
"integrity": "sha512-AGwHGQBKumlk/MDfrSOf0JHhJCImdDMcGNoqKmKkU+68GFazv3CQ6q9r7Ja1sKDZmYWTckY/uLyEznheTDycnA=="
|
||||
},
|
||||
"posix-character-classes": {
|
||||
"version": "0.1.1",
|
||||
@@ -11952,14 +12017,6 @@
|
||||
"integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
|
||||
"dev": true
|
||||
},
|
||||
"ps-tree": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz",
|
||||
"integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=",
|
||||
"requires": {
|
||||
"event-stream": "~3.3.0"
|
||||
}
|
||||
},
|
||||
"pseudomap": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
|
||||
@@ -12224,6 +12281,17 @@
|
||||
"warning": "^4.0.1"
|
||||
}
|
||||
},
|
||||
"react-helmet": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-5.2.0.tgz",
|
||||
"integrity": "sha1-qBgR3yExOm1VxfBYxK66XW89l6c=",
|
||||
"requires": {
|
||||
"deep-equal": "^1.0.1",
|
||||
"object-assign": "^4.1.1",
|
||||
"prop-types": "^15.5.4",
|
||||
"react-side-effect": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"react-hot-loader": {
|
||||
"version": "4.3.11",
|
||||
"resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.3.11.tgz",
|
||||
@@ -12238,25 +12306,6 @@
|
||||
"shallowequal": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"react-image-cropper": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/react-image-cropper/-/react-image-cropper-1.3.0.tgz",
|
||||
"integrity": "sha512-OPEMv66xXQdNsAixqxhlsSX3+D3KVRQMYc6YHmgGINeKx433xB9l04hMFynngPuUa+ChiKal6aQmbzpg79iJ+Q==",
|
||||
"requires": {
|
||||
"deep-extend": "^0.4.1",
|
||||
"npm-run-all": "^4.1.1",
|
||||
"prop-types": "^15.6.0",
|
||||
"react": "^16.2.0",
|
||||
"react-dom": "^16.2.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"deep-extend": {
|
||||
"version": "0.4.2",
|
||||
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
|
||||
"integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8="
|
||||
}
|
||||
}
|
||||
},
|
||||
"react-is": {
|
||||
"version": "16.5.2",
|
||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.5.2.tgz",
|
||||
@@ -12294,6 +12343,15 @@
|
||||
"warning": "^4.0.1"
|
||||
}
|
||||
},
|
||||
"react-side-effect": {
|
||||
"version": "1.1.5",
|
||||
"resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-1.1.5.tgz",
|
||||
"integrity": "sha512-Z2ZJE4p/jIfvUpiUMRydEVpQRf2f8GMHczT6qLcARmX7QRb28JDBTpnM2g/i5y/p7ZDEXYGHWg0RbhikE+hJRw==",
|
||||
"requires": {
|
||||
"exenv": "^1.2.1",
|
||||
"shallowequal": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"react-transition-group": {
|
||||
"version": "2.5.0",
|
||||
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.5.0.tgz",
|
||||
@@ -13189,6 +13247,14 @@
|
||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
|
||||
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
|
||||
},
|
||||
"schedule": {
|
||||
"version": "0.5.0",
|
||||
"resolved": "https://registry.npmjs.org/schedule/-/schedule-0.5.0.tgz",
|
||||
"integrity": "sha512-HUcJicG5Ou8xfR//c2rPT0lPIRR09vVvN81T9fqfVgBmhERUbDEQoYKjpBxbueJnCPpSu2ujXzOnRQt6x9o/jw==",
|
||||
"requires": {
|
||||
"object-assign": "^4.1.1"
|
||||
}
|
||||
},
|
||||
"scheduler": {
|
||||
"version": "0.11.0",
|
||||
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.11.0.tgz",
|
||||
@@ -13424,8 +13490,7 @@
|
||||
"shallowequal": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
|
||||
"integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==",
|
||||
"dev": true
|
||||
"integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
|
||||
},
|
||||
"shebang-command": {
|
||||
"version": "1.2.0",
|
||||
@@ -13665,14 +13730,6 @@
|
||||
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
|
||||
"integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA=="
|
||||
},
|
||||
"split": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
|
||||
"integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
|
||||
"requires": {
|
||||
"through": "2"
|
||||
}
|
||||
},
|
||||
"split-string": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
|
||||
@@ -13760,15 +13817,6 @@
|
||||
"readable-stream": "^2.0.2"
|
||||
}
|
||||
},
|
||||
"stream-combiner": {
|
||||
"version": "0.2.2",
|
||||
"resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz",
|
||||
"integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=",
|
||||
"requires": {
|
||||
"duplexer": "~0.1.1",
|
||||
"through": "~2.3.4"
|
||||
}
|
||||
},
|
||||
"stream-each": {
|
||||
"version": "1.2.3",
|
||||
"resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
|
||||
@@ -14082,7 +14130,8 @@
|
||||
"through": {
|
||||
"version": "2.3.8",
|
||||
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
|
||||
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
|
||||
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
|
||||
"dev": true
|
||||
},
|
||||
"through2": {
|
||||
"version": "2.0.3",
|
||||
|
||||
+3
-3
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@advancedalgos/teams-client",
|
||||
"version": "0.0.28",
|
||||
"version": "0.0.32",
|
||||
"description": "Advanced Algos Team client-side web app",
|
||||
"main": "src/index.js",
|
||||
"scripts": {
|
||||
@@ -69,7 +69,7 @@
|
||||
"workbox-cli": "^3.6.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"@advancedalgos/web-components": "0.0.15",
|
||||
"@advancedalgos/web-components": "0.0.18",
|
||||
"@azure/storage-blob": "^10.0.0-preview",
|
||||
"apollo-cache-inmemory": "^1.3.5",
|
||||
"apollo-client": "^2.4.2",
|
||||
@@ -98,7 +98,7 @@
|
||||
"subscriptions-transport-ws": "^0.9.15"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@material-ui/core": "^3.2.2",
|
||||
"@material-ui/core": "^3.6.2",
|
||||
"@material-ui/icons": "^3.0.1"
|
||||
},
|
||||
"standard": {
|
||||
|
||||
@@ -120,7 +120,7 @@ export class ManageFBEdit extends Component {
|
||||
let avatar = null
|
||||
if (fb.avatar !== undefined && fb.avatar !== null) avatar = fb.avatar
|
||||
if (this.state.avatar !== null) avatar = this.state.avatar
|
||||
if (this.state.avatar === null && fb.avatar === undefined) avatar = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
if (this.state.avatar === null && fb.avatar === undefined) avatar = process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
|
||||
if (loading || data === undefined) {
|
||||
return (<MessageCard message='Loading...' />)
|
||||
|
||||
@@ -18,7 +18,7 @@ export const ManageFBItem = ({ classes, team, authId }) => {
|
||||
if (team.fb[0].avatar !== undefined && team.fb[0].avatar !== 'a') {
|
||||
avatar = team.fb[0].avatar
|
||||
} else {
|
||||
avatar = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
avatar = process.env.STORAGE_URL+'/module-teams/module-default/aa-avatar-default.png'
|
||||
}
|
||||
return (
|
||||
<Grid item xs={12}>
|
||||
|
||||
@@ -63,7 +63,7 @@ export const ManageMembersTeamItem = ({ classes, team, authId }) => {
|
||||
if (team.profile.avatar !== undefined && team.profile.avatar !== 'a') {
|
||||
avatar = team.profile.avatar
|
||||
} else {
|
||||
avatar = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
avatar = process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
}
|
||||
if (team.members.length > 0) {
|
||||
return (
|
||||
|
||||
@@ -72,12 +72,12 @@ export class ManageTeamDetails extends Component {
|
||||
if (profile.avatar !== undefined && profile.avatar !== null) {
|
||||
avatar = profile.avatar
|
||||
} else {
|
||||
avatar = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
avatar = process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
}
|
||||
if (profile.banner !== undefined && profile.banner !== null) {
|
||||
banner = profile.banner
|
||||
} else {
|
||||
banner = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-banner-default.png'
|
||||
banner = process.env.STORAGE_URL + '/module-teams/module-default/aa-banner-default.png'
|
||||
}
|
||||
return (
|
||||
<div>
|
||||
|
||||
@@ -129,11 +129,11 @@ export class ManageTeamEdit extends Component {
|
||||
let avatar = null
|
||||
if (team.profile !== null && team.profile.avatar !== undefined && team.profile.avatar !== null) avatar = team.profile.avatar
|
||||
if (this.state.avatar !== null) avatar = this.state.avatar
|
||||
if (this.state.avatar === null && team.profile !== null && team.profile.avatar === undefined) avatar = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
if (this.state.avatar === null && team.profile !== null && team.profile.avatar === undefined) avatar = process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
let banner = null
|
||||
if (team.profile !== null && team.profile.banner !== undefined && team.profile.banner !== null) banner = team.profile.banner
|
||||
if (this.state.banner !== null) banner = this.state.banner
|
||||
if (this.state.banner === null && team.profile !== null && team.profile.banner === undefined) banner = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-banner-default.png'
|
||||
if (this.state.banner === null && team.profile !== null && team.profile.banner === undefined) banner = process.env.STORAGE_URL + '/module-teams/module-default/aa-banner-default.png'
|
||||
log.debug('team images: ', avatar, banner)
|
||||
|
||||
if (loading || data === undefined) {
|
||||
|
||||
@@ -20,7 +20,7 @@ export const ManageTeamsItem = ({ classes, team, authId }) => {
|
||||
if (team.profile.avatar !== undefined && team.profile.avatar !== 'a') {
|
||||
avatar = team.profile.avatar
|
||||
} else {
|
||||
avatar = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
avatar = process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
}
|
||||
return (
|
||||
<Grid item xs={12}>
|
||||
|
||||
@@ -68,7 +68,7 @@ export class ManageFBEdit extends Component {
|
||||
const containerName = slug
|
||||
|
||||
let avatar = null
|
||||
if (this.state.avatar === null && fb.avatar === undefined) avatar = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
if (this.state.avatar === null && fb.avatar === undefined) avatar = process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
if (fb.avatar !== undefined && fb.avatar !== null) avatar = fb.avatar
|
||||
if (this.state.avatar !== null) avatar = this.state.avatar
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ export const ManageFBItem = ({ classes, team }) => {
|
||||
if (team.fb[0].avatar !== undefined && team.fb[0].avatar !== 'a') {
|
||||
avatar = team.fb[0].avatar
|
||||
} else {
|
||||
avatar = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
avatar = process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
}
|
||||
return (
|
||||
<Grid item xs={12}>
|
||||
|
||||
@@ -23,7 +23,7 @@ const styles = theme => ({
|
||||
|
||||
const Landing = ({ classes, ...props }) => (
|
||||
<React.Fragment>
|
||||
<BannerTopBar size='big' title='Teams Module' text='Discover, create and manage Advanced Algos teams.' backgroundUrl='https://advancedalgos.net/img/photos/teams.jpg' />
|
||||
<BannerTopBar size='big' title='Teams Module' text='Responsible for all teams at Advanced Algos.' backgroundUrl='https://advancedalgos.net/img/photos/teams.jpg' />
|
||||
<div className='homePage container'>
|
||||
<Typography variant='h1' align='center' className='title'>
|
||||
Welcome to the Teams Module!
|
||||
|
||||
@@ -8,6 +8,7 @@ import TextField from '@material-ui/core/TextField'
|
||||
import FormControl from '@material-ui/core/FormControl'
|
||||
import FormHelperText from '@material-ui/core/FormHelperText'
|
||||
import Typography from '@material-ui/core/Typography'
|
||||
import Grid from '@material-ui/core/Grid'
|
||||
import { isEmpty } from '../../../utils/js-helpers'
|
||||
|
||||
import CREATE_TEAM from '../../../graphql/teams/CreateTeamMutation'
|
||||
@@ -20,14 +21,22 @@ const styles = theme => ({
|
||||
width: '100%',
|
||||
margin: '3em 0 1em'
|
||||
},
|
||||
typography: {
|
||||
width: '80%',
|
||||
marginLeft: '10%',
|
||||
marginTop: 40
|
||||
},
|
||||
dialogStyle: {
|
||||
padding: '3em'
|
||||
},
|
||||
textField: {
|
||||
marginBottom: 10
|
||||
width: '80%',
|
||||
marginLeft: '10%',
|
||||
marginTop: 25
|
||||
},
|
||||
submitButton: {
|
||||
margin: `${theme.spacing.unit * 2}px ${theme.spacing.unit * 6}px`
|
||||
margin: theme.spacing.unit,
|
||||
marginTop: theme.spacing.unit * 3
|
||||
}
|
||||
})
|
||||
|
||||
@@ -84,7 +93,10 @@ export class CreateTeamForm extends Component {
|
||||
error={this.state.nameError !== '' || this.state.botNameError !== '' || error !== null}
|
||||
className={classes.formContainer}
|
||||
>
|
||||
<Typography variant='subtitle2' align='center'>Create a name for your team</Typography>
|
||||
<Typography className={classes.typography} variant='body1' gutterBottom align='left'>
|
||||
Give a nice and memorable name to your team.
|
||||
</Typography>
|
||||
|
||||
<TextField
|
||||
autoFocus
|
||||
id='name'
|
||||
@@ -99,8 +111,8 @@ export class CreateTeamForm extends Component {
|
||||
{this.state.nameError !== '' && (
|
||||
<FormHelperText>{this.state.nameError}</FormHelperText>
|
||||
)}
|
||||
<Typography variant='subtitle2' align='center' ><br />
|
||||
Create a name for your teams bot.
|
||||
<Typography className={classes.typography} variant='body1' gutterBottom align='left'>
|
||||
Give a name for to the bot you are forking.
|
||||
</Typography>
|
||||
<TextField
|
||||
autoFocus
|
||||
@@ -118,16 +130,23 @@ export class CreateTeamForm extends Component {
|
||||
)}
|
||||
{error && <FormHelperText>{errors}</FormHelperText>}
|
||||
{loader}
|
||||
<Button
|
||||
onClick={e => {
|
||||
this.handleSubmit(e, createTeam, this.state.name, this.state.botName)
|
||||
}}
|
||||
variant='contained'
|
||||
color='secondary'
|
||||
className={classes.submitButton}
|
||||
>
|
||||
Create Team
|
||||
</Button>
|
||||
|
||||
<Grid container justify='center' >
|
||||
<Grid item>
|
||||
|
||||
<Button
|
||||
onClick={e => {
|
||||
this.handleSubmit(e, createTeam, this.state.name, this.state.botName)
|
||||
}}
|
||||
variant='contained'
|
||||
color='secondary'
|
||||
className={classes.submitButton}
|
||||
>
|
||||
Create Team
|
||||
</Button>
|
||||
|
||||
</Grid>
|
||||
</Grid>
|
||||
</FormControl>
|
||||
)
|
||||
}}
|
||||
|
||||
@@ -72,12 +72,12 @@ export class ManageTeamDetails extends Component {
|
||||
if (profile.avatar !== undefined && profile.avatar !== null) {
|
||||
avatar = profile.avatar
|
||||
} else {
|
||||
avatar = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
avatar = process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
}
|
||||
if (profile.banner !== undefined && profile.banner !== null) {
|
||||
banner = profile.banner
|
||||
} else {
|
||||
banner = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-banner-default.png'
|
||||
banner = process.env.STORAGE_URL + '/module-teams/module-default/aa-banner-default.png'
|
||||
}
|
||||
return (
|
||||
<div>
|
||||
|
||||
@@ -75,12 +75,12 @@ export class ManageTeamEdit extends Component {
|
||||
const AzureStorageSAS = process.env.AZURE_STORAGE_SAS_TEAMS
|
||||
const containerName = team.slug
|
||||
let avatar = null
|
||||
if (this.state.avatar === null && team.profile !== null && (team.profile.avatar === undefined || team.profile.avatar === null)) avatar = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
if (this.state.avatar === null && team.profile !== null && (team.profile.avatar === undefined || team.profile.avatar === null)) avatar = process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
if (team.profile !== null && team.profile.avatar !== undefined && team.profile.avatar !== null) avatar = team.profile.avatar
|
||||
if (this.state.avatar !== null) avatar = this.state.avatar
|
||||
|
||||
let banner = null
|
||||
if (this.state.banner === null && team.profile !== null && (team.profile.banner === undefined || team.profile.banner === null)) banner = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-banner-default.png'
|
||||
if (this.state.banner === null && team.profile !== null && (team.profile.banner === undefined || team.profile.banner === null)) banner = process.env.STORAGE_URL + '/module-teams/module-default/aa-banner-default.png'
|
||||
if (team.profile !== null && team.profile.banner !== undefined && team.profile.banner !== null) banner = team.profile.banner
|
||||
if (this.state.banner !== null) banner = this.state.banner
|
||||
log.debug('team images: ', avatar, banner)
|
||||
|
||||
@@ -142,12 +142,12 @@ export class ManageTeamProfileEdit extends Component {
|
||||
const AzureStorageSAS = process.env.AZURE_STORAGE_SAS_TEAMS
|
||||
const containerName = team.slug
|
||||
let avatar = null
|
||||
if (this.state.avatar === null && team.profile !== null && (team.profile.avatar === undefined || team.profile.avatar === null)) avatar = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
if (this.state.avatar === null && team.profile !== null && (team.profile.avatar === undefined || team.profile.avatar === null)) avatar = process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
if (team.profile !== null && team.profile.avatar !== undefined && team.profile.avatar !== null) avatar = team.profile.avatar
|
||||
if (this.state.avatar !== null) avatar = this.state.avatar
|
||||
|
||||
let banner = null
|
||||
if (this.state.banner === null && team.profile !== null && (team.profile.banner === undefined || team.profile.banner === null)) banner = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-banner-default.png'
|
||||
if (this.state.banner === null && team.profile !== null && (team.profile.banner === undefined || team.profile.banner === null)) banner = process.env.STORAGE_URL + '/module-teams/module-default/aa-banner-default.png'
|
||||
if (team.profile !== null && team.profile.banner !== undefined && team.profile.banner !== null) banner = team.profile.banner
|
||||
if (this.state.banner !== null) banner = this.state.banner
|
||||
log.debug('team images: ', avatar, banner)
|
||||
@@ -241,7 +241,10 @@ export class ManageTeamProfileEdit extends Component {
|
||||
width: '125px',
|
||||
overflow: 'visible'
|
||||
}}
|
||||
dropzoneStyle={{ height: '125px' }}
|
||||
dropzoneStyle={{
|
||||
height: 125,
|
||||
title: 'Drop new image or click to select'
|
||||
}}
|
||||
AzureStorageUrl={AzureStorageUrl}
|
||||
AzureSASURL={AzureStorageSAS}
|
||||
cropRatio={1}
|
||||
|
||||
@@ -64,7 +64,7 @@ export class ManageTeamProfileFBEdit extends Component {
|
||||
const containerName = slug
|
||||
|
||||
let avatar = null
|
||||
if (this.state.avatar === null && fb.avatar === undefined) avatar = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
if (this.state.avatar === null && fb.avatar === undefined) avatar = process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
if (fb.avatar !== undefined && fb.avatar !== null) avatar = fb.avatar
|
||||
if (this.state.avatar !== null) avatar = this.state.avatar
|
||||
|
||||
@@ -137,7 +137,10 @@ export class ManageTeamProfileFBEdit extends Component {
|
||||
width: '125px',
|
||||
overflow: 'visible'
|
||||
}}
|
||||
dropzoneStyle={{ height: '125px' }}
|
||||
dropzoneStyle={{
|
||||
height: 125,
|
||||
title: 'Drop new image or click to select'
|
||||
}}
|
||||
AzureStorageUrl={AzureStorageUrl}
|
||||
AzureSASURL={AzureStorageSAS}
|
||||
cropRatio={1}
|
||||
|
||||
@@ -40,7 +40,7 @@ const styles = theme => ({
|
||||
export const ManageTeamProvileFBView = ({ classes, team }) => {
|
||||
log.debug('ManageTeamProvileFBView', team, team.fb[0], team.fb[0].avatar)
|
||||
|
||||
let avatar = (team.fb[0].avatar !== undefined && team.fb[0].avatar !== null) ? team.fb[0].avatar : 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
let avatar = (team.fb[0].avatar !== undefined && team.fb[0].avatar !== null) ? team.fb[0].avatar : process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
|
||||
return (
|
||||
<Grid item xs={12} className={classes.fbContainer}>
|
||||
|
||||
@@ -88,8 +88,8 @@ const styles = theme => ({
|
||||
})
|
||||
|
||||
const ManageTeamProfileView = ({ classes, team }) => {
|
||||
let avatar = team.profile.avatar || 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
let banner = team.profile.banner || 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-banner-default.png'
|
||||
let avatar = team.profile.avatar || process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
let banner = team.profile.banner || process.env.STORAGE_URL + '/module-teams/module-default/aa-banner-default.png'
|
||||
|
||||
const created = new Date(team.createdAt)
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ export const ManageTeamsItem = ({ classes, team, match, ...props }) => {
|
||||
if (team.profile.avatar !== undefined && team.profile.avatar !== 'a') {
|
||||
avatar = team.profile.avatar
|
||||
} else {
|
||||
avatar = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
avatar = process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
}
|
||||
return (
|
||||
<Grid item xs={12}>
|
||||
|
||||
@@ -22,11 +22,19 @@ const styles = theme => ({
|
||||
root: {
|
||||
flexGrow: 1
|
||||
},
|
||||
typography: {
|
||||
width: '80%',
|
||||
marginLeft: '10%',
|
||||
marginTop: 40
|
||||
},
|
||||
heroContent: {
|
||||
maxWidth: 800,
|
||||
margin: `${theme.spacing.unit * 4}px auto`,
|
||||
padding: 0
|
||||
},
|
||||
newTeamContainer: {
|
||||
padding: `${theme.spacing.unit * 4}px 0`
|
||||
},
|
||||
cardGrid: {
|
||||
padding: `${theme.spacing.unit * 8}px 0`
|
||||
},
|
||||
@@ -50,6 +58,13 @@ const styles = theme => ({
|
||||
height: 100,
|
||||
maxWidth: 100,
|
||||
justifyContent: 'flex-start'
|
||||
},
|
||||
paper: {
|
||||
width: '100%',
|
||||
flexGrow: 1,
|
||||
padding: 10,
|
||||
marginTop: '5%',
|
||||
marginBottom: '10%'
|
||||
}
|
||||
})
|
||||
|
||||
@@ -106,23 +121,23 @@ export const ManageTeamsList = ({ classes, match, ...props }) => (
|
||||
)
|
||||
} else {
|
||||
return (
|
||||
<div className={classes.root} >
|
||||
<Paper>
|
||||
<Grid container spacing={0} direction='column' justify='stretch' alignItems='center'>
|
||||
<Grid item xs={10}>
|
||||
<Typography variant='h5' align='center'>
|
||||
You don’t have any teams. Create one!
|
||||
</Typography>
|
||||
<Typography variant='body1' align='center' gutterBottom>
|
||||
To begin developing on the Advanced Algos platform, as well as participate in Algobot competitions,
|
||||
you'll need to create a team. A default trading algobot will be cloned and added to your team so
|
||||
that you can begin experimenting right away.
|
||||
</Typography>
|
||||
<CreateTeamForm />
|
||||
</Grid>
|
||||
</Grid>
|
||||
<div className='container'>
|
||||
<Paper className={classes.paper} >
|
||||
|
||||
<Typography className={classes.typography} variant='h5' gutterBottom>
|
||||
Your First Team
|
||||
</Typography>
|
||||
|
||||
<Typography className={classes.typography} variant='body1' gutterBottom align='left'>
|
||||
To begin developing on the Advanced Algos platform, as well as to participate in trading competitions,
|
||||
you will need to create a team or become a member of an existing one. Currently, the only option is to create your own team. As part of the same process, an already existing trading bot will be forked for you so that you do not have to start from scratch. It will be added to your team so
|
||||
that you can begin experimenting right away.
|
||||
</Typography>
|
||||
<CreateTeamForm />
|
||||
|
||||
</Paper>
|
||||
</div>
|
||||
|
||||
)
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -8,10 +8,10 @@ const ManageTeams = ({ match, ...props }) => (
|
||||
<div>
|
||||
<BannerTopBar
|
||||
size={match.params.slug !== undefined ? 'small' : 'medium'}
|
||||
title='Manage Your Teams'
|
||||
text='Discover, Create and manage Advanced Algos Teams'
|
||||
title='Your Teams'
|
||||
text='Create and manage your teams here.'
|
||||
backgroundUrl='https://advancedalgos.net/img/photos/teams.jpg'
|
||||
/>
|
||||
/>
|
||||
<div className='container'>
|
||||
<ManageTeamsList {...props} match={match} />
|
||||
</div>
|
||||
|
||||
@@ -63,7 +63,7 @@ export const ManageMembersTeamItem = ({ classes, team, authId }) => {
|
||||
if (team.profile.avatar !== undefined && team.profile.avatar !== 'a') {
|
||||
avatar = team.profile.avatar
|
||||
} else {
|
||||
avatar = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
avatar = process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
}
|
||||
if (team.members.length > 0) {
|
||||
return (
|
||||
|
||||
@@ -95,13 +95,13 @@ const TeamsDetails = ({ classes, team }) => {
|
||||
if (team.profile.avatar !== undefined && team.profile.avatar !== null) {
|
||||
avatar = team.profile.avatar
|
||||
} else {
|
||||
avatar = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
avatar = process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
}
|
||||
let banner
|
||||
if (team.profile.banner !== undefined && team.profile.banner !== null) {
|
||||
banner = team.profile.banner
|
||||
} else {
|
||||
banner = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-banner-default.png'
|
||||
banner = process.env.STORAGE_URL + '/module-teams/module-default/aa-banner-default.png'
|
||||
}
|
||||
|
||||
const created = new Date(team.createdAt)
|
||||
|
||||
@@ -35,31 +35,47 @@ const styles = theme => ({
|
||||
})
|
||||
|
||||
export const TeamsFBView = ({ classes, team }) => {
|
||||
log.debug('ManageTeamProvileFBView', team, team.fb[0], team.fb[0].avatar)
|
||||
log.debug('ManageTeamProvileFBView', team, team.fb[0])
|
||||
let avatar = process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
if (team.fb.length > 0) {
|
||||
avatar = team.fb[0].avatar
|
||||
|
||||
let avatar = (team.fb[0].avatar !== undefined && team.fb[0].avatar !== null) ? team.fb[0].avatar : 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
|
||||
return (
|
||||
<Grid item xs={12} className={classes.fbContainer}>
|
||||
<Card className={classes.card}>
|
||||
<div className={classes.cardDetails}>
|
||||
<CardMedia
|
||||
className={classes.cardMedia}
|
||||
image={avatar}
|
||||
title={team.name}
|
||||
/>
|
||||
<CardContent className={classes.cardContent}>
|
||||
<Typography gutterBottom variant='h5' component='h2'>
|
||||
{team.fb[0].name}
|
||||
</Typography>
|
||||
<Typography variant='caption' color='textSecondary'>
|
||||
{team.fb[0].kind}
|
||||
</Typography>
|
||||
</CardContent>
|
||||
</div>
|
||||
</Card>
|
||||
</Grid>
|
||||
)
|
||||
return (
|
||||
<Grid item xs={12} className={classes.fbContainer}>
|
||||
<Card className={classes.card}>
|
||||
<div className={classes.cardDetails}>
|
||||
<CardMedia
|
||||
className={classes.cardMedia}
|
||||
image={avatar}
|
||||
title={team.name}
|
||||
/>
|
||||
<CardContent className={classes.cardContent}>
|
||||
<Typography gutterBottom variant='h5' component='h2'>
|
||||
{team.fb[0].name}
|
||||
</Typography>
|
||||
<Typography variant='caption' color='textSecondary'>
|
||||
{team.fb[0].kind}
|
||||
</Typography>
|
||||
</CardContent>
|
||||
</div>
|
||||
</Card>
|
||||
</Grid>
|
||||
)
|
||||
} else {
|
||||
return (
|
||||
<Grid item xs={12} className={classes.fbContainer}>
|
||||
<Card className={classes.card}>
|
||||
<div className={classes.cardDetails}>
|
||||
<CardContent className={classes.cardContent}>
|
||||
<Typography gutterBottom variant='h6'>
|
||||
No Financial Beings
|
||||
</Typography>
|
||||
</CardContent>
|
||||
</div>
|
||||
</Card>
|
||||
</Grid>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
TeamsFBView.propTypes = {
|
||||
|
||||
@@ -43,13 +43,13 @@ export const TeamsItem = ({ classes, team }) => {
|
||||
if (team.profile.avatar !== undefined && team.profile.avatar !== 'a') {
|
||||
avatar = team.profile.avatar
|
||||
} else {
|
||||
avatar = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-avatar-default.png'
|
||||
avatar = process.env.STORAGE_URL + '/module-teams/module-default/aa-avatar-default.png'
|
||||
}
|
||||
let banner
|
||||
if (team.profile.banner !== undefined && team.profile.banner !== null) {
|
||||
banner = team.profile.banner
|
||||
} else {
|
||||
banner = 'https://aadevelop.blob.core.windows.net/module-teams/module-default/aa-banner-default.png'
|
||||
banner = process.env.STORAGE_URL + '/module-teams/module-default/aa-banner-default.png'
|
||||
}
|
||||
return (
|
||||
<Grid item xs={12} sm={6} md={4}>
|
||||
|
||||
@@ -31,7 +31,7 @@ const styles = theme => ({
|
||||
|
||||
const Teams = ({ classes, match }) => (
|
||||
<React.Fragment>
|
||||
<BannerTopBar size={match.params.slug !== undefined ? 'small' : 'medium'} title='Browse Teams' text='Explore Advanced Algos Teams' backgroundUrl='https://advancedalgos.net/img/photos/teams.jpg' />
|
||||
<BannerTopBar size={match.params.slug !== undefined ? 'small' : 'medium'} title='Teams Directory' text='All teams in Advanced Algos are here.' backgroundUrl='https://advancedalgos.net/img/photos/teams.jpg' />
|
||||
<div className='container'>
|
||||
<TeamsList match={match} />
|
||||
</div>
|
||||
|
||||
Generated
-5
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"name": "AATeamModule",
|
||||
"version": "2.0.1",
|
||||
"lockfileVersion": 1
|
||||
}
|
||||
Reference in new issue
Block a user