diff --git a/backend/src/apis/loginAPI.ts b/backend/src/apis/loginAPI.ts index 7160db68c..965b1ccfc 100644 --- a/backend/src/apis/loginAPI.ts +++ b/backend/src/apis/loginAPI.ts @@ -33,7 +33,7 @@ export const apiGet = async (url: string): Promise => { }) .catch((error) => { // eslint-disable-next-line no-console - console.log('IN apiGet.ERROR: ' + JSON.stringify({ success: false, result: error })) + console.log('IN apiGet.ERROR: ', { success: false, result: error }) return { success: false, data: error.message } }) } diff --git a/backend/src/apis/loginAPI.ts.old b/backend/src/apis/loginAPI.ts.old deleted file mode 100644 index 8e4b5e040..000000000 --- a/backend/src/apis/loginAPI.ts.old +++ /dev/null @@ -1,184 +0,0 @@ -import axios from 'axios' -import { graphql } from 'graphql' -import CONFIG from '../config' -import { User } from '../graphql/models/User' -import { LoginUserInput } from '../graphql/inputs/LoginUserInput' -// eslint-disable-next-line no-unused-vars -// import regeneratorRuntime from 'regenerator-runtime' - -// control email-text sended with email verification code -const EMAIL_TYPE = { - DEFAULT: 2, // if user has registered directly - ADMIN: 5, // if user was registered by an admin -} - -const apiGet = async (url: string) => { - try { - const result = await axios.get(url) - if (result.status !== 200) { - throw new Error('HTTP Status Error ' + result.status) - } - if (!['success', 'warning'].includes(result.data.state)) { - throw new Error(result.data.msg) - } - return { success: true, result } - } catch (error) { - return { success: false, result: error } - } -} - -const apiPost = async (url: string, payload: any): Promise => { - try { - const result = await axios.post(url, payload) - if (result.status !== 200) { - throw new Error('HTTP Status Error ' + result.status) - } - if (result.data.state === 'warning') { - return { success: true, result: result.data.errors } - } - if (result.data.state !== 'success') { - throw new Error(result.data.msg) - } - return { success: true, result } - } catch (error) { - return { success: false, result: error } - } -} - -interface NetworkInfosResult { - state: string - msg?: string - errors: string[] - data: { - groups?: string[] - } -} - -interface LoginResult { - state: string - msg?: string - details?: number - info?: string - user?: User - // eslint-disable-next-line camelcase - session_id?: number -} - -const loginAPI = { - login: async (login: LoginUserInput): Promise => { - return (await apiPost(CONFIG.LOGIN_API_URL + 'unsecureLogin', login)).result.data - }, - logout: async (sessionId: number): Promise => { - const payload: any = { session_id: sessionId } - return apiPost(CONFIG.LOGIN_API_URL + 'logout', payload) - }, - create: async ( - email: string, - firstName: string, - lastName: string, - password: string, - ): Promise => { - const payload: any = { - email, - first_name: firstName, - last_name: lastName, - password, - emailType: EMAIL_TYPE.DEFAULT, - login_after_register: true, - } - return apiPost(CONFIG.LOGIN_API_URL + 'createUser', payload) - }, - sendEmail: async ( - email: string, - email_text = 7, - email_verification_code_type = 'resetPassword', - ): Promise => { - const payload: any = { - email, - email_text, - email_verification_code_type, - } - return apiPost(CONFIG.LOGIN_API_URL + 'sendEmail', payload) - }, - loginViaEmailVerificationCode: async (optin: number): Promise => { - return apiGet( - CONFIG.LOGIN_API_URL + 'loginViaEmailVerificationCode?emailVerificationCode=' + optin, - ) - }, - getUserInfos: async (sessionId: number, email: string): Promise => { - const payload: any = { - session_id: sessionId, - email: email, - ask: ['user.first_name', 'user.last_name'], - } - return apiPost(CONFIG.LOGIN_API_URL + 'getUserInfos', payload) - }, - updateUserInfos: async (sessionId: number, email: string, data: any): Promise => { - const payload: any = { - session_id: sessionId, - email, - update: { - 'User.first_name': data.firstName, - 'User.last_name': data.lastName, - 'User.description': data.description, - }, - } - return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) - }, - changePassword: async (sessionId: number, email: string, password: string): Promise => { - const payload: any = { - session_id: sessionId, - email, - password, - } - return apiPost(CONFIG.LOGIN_API_URL + 'resetPassword', payload) - }, - changePasswordProfile: async ( - sessionId: number, - email: string, - password: string, - passwordNew: string, - ): Promise => { - const payload: any = { - session_id: sessionId, - email, - update: { - 'User.password_old': password, - 'User.password': passwordNew, - }, - } - return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) - }, - changeUsernameProfile: async ( - sessionId: number, - email: string, - username: string, - ): Promise => { - const payload: any = { - session_id: sessionId, - email, - update: { - 'User.username': username, - }, - } - return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) - }, - updateLanguage: async (sessionId: number, email: string, language: string): Promise => { - const payload: any = { - session_id: sessionId, - email, - update: { - 'User.language': language, - }, - } - return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) - }, - checkUsername: async (username: string, groupId = 1): Promise => { - return apiGet(CONFIG.LOGIN_API_URL + `checkUsername?username=${username}&group_id=${groupId}`) - }, - getNetworkInfos: async (ask: string[]): Promise => { - return (await apiPost(CONFIG.LOGIN_API_URL + `networkInfos`, { ask: ask })).result.data - }, -} - -export { loginAPI, NetworkInfosResult, LoginResult } diff --git a/backend/src/graphql/inputs/TransactionInput.ts b/backend/src/graphql/inputs/TransactionInput.ts index db010390a..049a9b2a9 100644 --- a/backend/src/graphql/inputs/TransactionInput.ts +++ b/backend/src/graphql/inputs/TransactionInput.ts @@ -1,7 +1,7 @@ import { ArgsType, Field } from 'type-graphql' @ArgsType() -export class TransactionInput { +export class TransactionListInput { @Field(() => Number) sessionId: number diff --git a/backend/src/graphql/models/Balance.ts b/backend/src/graphql/models/Balance.ts index ceb479b9c..93d497e0c 100644 --- a/backend/src/graphql/models/Balance.ts +++ b/backend/src/graphql/models/Balance.ts @@ -1,27 +1,21 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -import { Entity, BaseEntity, Column } from 'typeorm' import { ObjectType, Field } from 'type-graphql' -@Entity() @ObjectType() -export class Balance extends BaseEntity { +export class Balance { constructor(json: any) { - super() - this.balance = json.balance - this.decay = json.decay + this.balance = Number(json.balance) + this.decay = Number(json.decay) this.decayDate = json.decay_date } @Field(() => Number) - @Column() balance: number @Field(() => Number) - @Column() decay: number @Field(() => String) - @Column() decayDate: string } diff --git a/backend/src/graphql/models/BaseResponse.ts b/backend/src/graphql/models/BaseResponse.ts deleted file mode 100644 index 712660bd3..000000000 --- a/backend/src/graphql/models/BaseResponse.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Entity, BaseEntity } from 'typeorm' -import { ObjectType, Field } from 'type-graphql' - -@Entity() -@ObjectType() -export class BaseResponse extends BaseEntity { - @Field(() => Boolean) - success: boolean -} diff --git a/backend/src/graphql/models/ChangePasswordResponse.ts b/backend/src/graphql/models/ChangePasswordResponse.ts deleted file mode 100644 index 1ba3247cd..000000000 --- a/backend/src/graphql/models/ChangePasswordResponse.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Entity, BaseEntity } from 'typeorm' -import { ObjectType, Field } from 'type-graphql' - -@Entity() -@ObjectType() -export class ChangePasswordResponse extends BaseEntity { - @Field(() => String) - state: string -} diff --git a/backend/src/graphql/models/CheckUsernameResponse.ts b/backend/src/graphql/models/CheckUsernameResponse.ts index ac51b64e1..b3186ffcf 100644 --- a/backend/src/graphql/models/CheckUsernameResponse.ts +++ b/backend/src/graphql/models/CheckUsernameResponse.ts @@ -1,9 +1,15 @@ -import { Entity, BaseEntity } from 'typeorm' +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { ObjectType, Field } from 'type-graphql' -@Entity() @ObjectType() -export class CheckUsernameResponse extends BaseEntity { +export class CheckUsernameResponse { + constructor(json: any) { + this.state = json.state + this.msg = json.msg + this.groupId = json.group_id + } + @Field(() => String) state: string diff --git a/backend/src/graphql/models/CreateResponse.ts b/backend/src/graphql/models/CreateResponse.ts deleted file mode 100644 index 54276b031..000000000 --- a/backend/src/graphql/models/CreateResponse.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Entity, BaseEntity } from 'typeorm' -import { ObjectType, Field } from 'type-graphql' - -@Entity() -@ObjectType() -export class CreateResponse extends BaseEntity { - constructor(json: any) { - super() - this.state = json.state - } - - @Field(() => String) - state: string -} diff --git a/backend/src/graphql/models/Decay.ts b/backend/src/graphql/models/Decay.ts new file mode 100644 index 000000000..3d918ce7a --- /dev/null +++ b/backend/src/graphql/models/Decay.ts @@ -0,0 +1,25 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +import { ObjectType, Field } from 'type-graphql' + +@ObjectType() +export class Decay { + constructor(json: any) { + this.balance = Number(json.balance) + this.decayStart = json.decay_start + this.decayEnd = json.decay_end + this.decayDuration = json.decay_duration + } + + @Field(() => Number) + balance: number + + @Field({ nullable: true }) + decayStart?: number + + @Field({ nullable: true }) + decayEnd?: number + + @Field(() => String) + decayDuration: string +} diff --git a/backend/src/graphql/models/LoginResponse.ts b/backend/src/graphql/models/LoginResponse.ts index 2abe1ef96..258784b75 100644 --- a/backend/src/graphql/models/LoginResponse.ts +++ b/backend/src/graphql/models/LoginResponse.ts @@ -1,25 +1,20 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -import { Entity, BaseEntity, Column } from 'typeorm' import { ObjectType, Field } from 'type-graphql' import { User } from './User' // temporaray solution until we have JWT implemented -@Entity() @ObjectType() -export class LoginResponse extends BaseEntity { +export class LoginResponse { constructor(json: any) { - super() this.sessionId = json.session_id this.user = new User(json.user) } @Field(() => Number) - @Column() sessionId: number @Field(() => User) - @Column() user: User } diff --git a/backend/src/graphql/models/LoginViaVerificationCode.ts b/backend/src/graphql/models/LoginViaVerificationCode.ts index bd0d66781..61286ca0e 100644 --- a/backend/src/graphql/models/LoginViaVerificationCode.ts +++ b/backend/src/graphql/models/LoginViaVerificationCode.ts @@ -1,22 +1,17 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -import { Entity, BaseEntity, Column } from 'typeorm' import { ObjectType, Field } from 'type-graphql' -@Entity() @ObjectType() -export class LoginViaVerificationCode extends BaseEntity { +export class LoginViaVerificationCode { constructor(json: any) { - super() this.sessionId = json.session_id this.email = json.user.email } @Field(() => Number) - @Column() sessionId: number @Field(() => String) - @Column() email: string } diff --git a/backend/src/graphql/models/SendEmailResponse.ts b/backend/src/graphql/models/SendPasswordResetEmailResponse.ts similarity index 56% rename from backend/src/graphql/models/SendEmailResponse.ts rename to backend/src/graphql/models/SendPasswordResetEmailResponse.ts index d8e163478..d387efede 100644 --- a/backend/src/graphql/models/SendEmailResponse.ts +++ b/backend/src/graphql/models/SendPasswordResetEmailResponse.ts @@ -1,11 +1,10 @@ -import { Entity, BaseEntity } from 'typeorm' +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { ObjectType, Field } from 'type-graphql' -@Entity() @ObjectType() -export class SendEmailResponse extends BaseEntity { +export class SendPasswordResetEmailResponse { constructor(json: any) { - super() this.state = json.state this.msg = json.msg } diff --git a/backend/src/graphql/models/Server.ts b/backend/src/graphql/models/Server.ts index e722a2c97..1b6f01627 100644 --- a/backend/src/graphql/models/Server.ts +++ b/backend/src/graphql/models/Server.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Entity, BaseEntity } from 'typeorm' import { ObjectType, Field } from 'type-graphql' diff --git a/backend/src/graphql/models/Transaction.ts b/backend/src/graphql/models/Transaction.ts index b638e797e..61670b06a 100644 --- a/backend/src/graphql/models/Transaction.ts +++ b/backend/src/graphql/models/Transaction.ts @@ -1,10 +1,89 @@ -import { Entity, BaseEntity, Column } from 'typeorm' +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { ObjectType, Field } from 'type-graphql' +import { Decay } from './Decay' + +// we need a better solution for the decay block: +// the first transaction on the first page shows the decay since the last transaction +// the format is actually a Decay and not a Transaction. +// Therefore we have a lot of nullable fields, which should be always present -@Entity() @ObjectType() -export class Transaction extends BaseEntity { +export class Transaction { + constructor(json: any) { + this.type = json.type + this.balance = Number(json.balance) + this.decayStart = json.decay_start + this.decayEnd = json.decay_end + this.decayDuration = json.decay_duration + this.memo = json.memo + this.transactionId = json.transaction_id + this.name = json.name + this.email = json.email + this.date = json.date + this.decay = json.decay + } + @Field(() => String) - @Column({ length: 191 }) - email: string + type: string + + @Field(() => Number) + balance: number + + @Field({ nullable: true }) + decayStart?: number + + @Field({ nullable: true }) + decayEnd?: number + + @Field({ nullable: true }) + decayDuration?: string + + @Field(() => String) + memo: string + + @Field(() => Number) + transactionId: number + + @Field({ nullable: true }) + name?: string + + @Field({ nullable: true }) + email?: string + + @Field({ nullable: true }) + date?: string + + @Field({ nullable: true }) + decay?: Decay +} + +@ObjectType() +export class TransactionList { + constructor(json: any) { + this.gdtSum = Number(json.gdtSum) + this.count = json.count + this.balance = Number(json.balance) + this.decay = Number(json.decay) + this.decayDate = json.decay_date + this.transactions = json.transactions + } + + @Field(() => Number) + gdtSum: number + + @Field(() => Number) + count: number + + @Field(() => Number) + balance: number + + @Field(() => Number) + decay: number + + @Field(() => String) + decayDate: string + + @Field(() => [Transaction]) + transactions: Transaction[] } diff --git a/backend/src/graphql/models/UpdateUserInfosResponse.ts b/backend/src/graphql/models/UpdateUserInfosResponse.ts index 14f834932..0e41f21cb 100644 --- a/backend/src/graphql/models/UpdateUserInfosResponse.ts +++ b/backend/src/graphql/models/UpdateUserInfosResponse.ts @@ -1,15 +1,13 @@ -import { Entity, BaseEntity } from 'typeorm' +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { ObjectType, Field } from 'type-graphql' -@Entity() @ObjectType() -export class UpdateUserInfosResponse extends BaseEntity { - @Field(() => String) - state: string +export class UpdateUserInfosResponse { + constructor(json: any) { + this.validValues = json.valid_values + } @Field(() => Number) validValues: number - - @Field(() => [String]) - errors: [string] } diff --git a/backend/src/graphql/models/User.ts b/backend/src/graphql/models/User.ts index 68543bf09..47037d483 100644 --- a/backend/src/graphql/models/User.ts +++ b/backend/src/graphql/models/User.ts @@ -1,18 +1,15 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -import { Entity, BaseEntity, Column } from 'typeorm' import { ObjectType, Field } from 'type-graphql' -@Entity() @ObjectType() -export class User extends BaseEntity { +export class User { /* @Field(() => ID) @PrimaryGeneratedColumn() id: number */ constructor(json: any) { - super() this.email = json.email this.firstName = json.first_name this.lastName = json.last_name @@ -22,62 +19,49 @@ export class User extends BaseEntity { } @Field(() => String) - @Column({ length: 191 }) email: string @Field(() => String) - @Column({ length: 150 }) firstName: string @Field(() => String) - @Column() lastName: string @Field(() => String) - @Column() username: string @Field(() => String) - @Column('text') description: string /* @Field(() => String) - @Column({ length: 64 }) pubkey: string // not sure about the type here. Maybe better to have a string @Field(() => number) - @Column({ type: 'datetime' }) created: number @Field(() => Boolean) - @Column({ default: false }) emailChecked: boolean @Field(() => Boolean) - @Column({ default: false }) passphraseShown: boolean */ @Field(() => String) - @Column({ default: 'de' }) language: string /* @Field(() => Boolean) - @Column({ default: false }) disabled: boolean */ /* I suggest to have a group as type here @Field(() => ID) - @Column() groupId: number // what is puvlisherId? @Field(() => ID) - @Column({ default: 0 }) publisherId: number */ } diff --git a/backend/src/graphql/models/UserInfoData.ts b/backend/src/graphql/models/UserInfoData.ts index 46b336d5e..2e65aca82 100644 --- a/backend/src/graphql/models/UserInfoData.ts +++ b/backend/src/graphql/models/UserInfoData.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Entity, BaseEntity } from 'typeorm' import { ObjectType, Field } from 'type-graphql' import { Server } from './Server' diff --git a/backend/src/graphql/resolvers/BalanceResolver.ts b/backend/src/graphql/resolvers/BalanceResolver.ts new file mode 100644 index 000000000..c483ad5c9 --- /dev/null +++ b/backend/src/graphql/resolvers/BalanceResolver.ts @@ -0,0 +1,14 @@ +import { Resolver, Query, /* Mutation, */ Arg } from 'type-graphql' +import CONFIG from '../../config' +import { Balance } from '../models/Balance' +import { apiGet } from '../../apis/loginAPI' + +@Resolver() +export class BalanceResolver { + @Query(() => Balance) + async balance(@Arg('sessionId') sessionId: number): Promise { + const result = await apiGet(CONFIG.COMMUNITY_API_URL + 'getBalance/' + sessionId) + if (!result.success) throw new Error(result.data) + return new Balance(result.data) + } +} diff --git a/backend/src/graphql/resolvers/CommunityTransactionResolver.ts b/backend/src/graphql/resolvers/CommunityTransactionResolver.ts deleted file mode 100644 index 1fcc214e7..000000000 --- a/backend/src/graphql/resolvers/CommunityTransactionResolver.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Resolver, Query, /* Mutation, */ Args, Arg } from 'type-graphql' -import CONFIG from '../../config' -import {} from '../models/Transaction' -import { Balance } from '../models/Balance' -import { - TransactionCreateArgs, - TransactionInput, - TransactionSendArgs, -} from '../inputs/TransactionInput' -import { apiPost, apiGet } from '../../apis/loginAPI' - -@Resolver() -export class CommunityTransactionResolver { - @Query(() => Balance) - async balance(@Arg('sessionId') sessionId: number): Promise { - // eslint-disable-next-line no-console - console.log('IN BALANCE: URL: ' + CONFIG.COMMUNITY_API_URL + 'getBalance/' + sessionId) - const result = await apiGet(CONFIG.COMMUNITY_API_URL + 'getBalance/' + sessionId) - return new Balance(result.result.data) - } - - @Query(() => String) - async transactions( - @Args() { sessionId, firstPage = 1, items = 5, order = 'DESC' }: TransactionInput, - ): Promise { - return apiGet( - `${CONFIG.COMMUNITY_API_URL}listTransactions/${firstPage}/${items}/${order}/${sessionId}`, - ) - } - - @Query(() => String) - async send(@Args() { sessionId, email, amount, memo }: TransactionSendArgs): Promise { - const payload = { - session_id: sessionId, - auto_sign: true, - email: email, - amount: amount, - memo: memo, - } - return apiPost(CONFIG.COMMUNITY_API_URL + 'sendCoins/', payload) - } - - @Query(() => String) - async createCoins( - @Args() { sessionId, email, amount, memo, targetDate = new Date() }: TransactionCreateArgs, - ): Promise { - const payload = { - sessionId, - email, - amount, - targetDate, - memo, - auto_sign: true, - } - return apiPost(CONFIG.COMMUNITY_API_URL + 'createCoins/', payload) - } -} diff --git a/backend/src/graphql/resolvers/TransactionResolver.ts b/backend/src/graphql/resolvers/TransactionResolver.ts new file mode 100644 index 000000000..a2853f08a --- /dev/null +++ b/backend/src/graphql/resolvers/TransactionResolver.ts @@ -0,0 +1,37 @@ +import { Resolver, Query, /* Mutation, */ Args } from 'type-graphql' +import CONFIG from '../../config' +import { TransactionList } from '../models/Transaction' +import { TransactionListInput, TransactionSendArgs } from '../inputs/TransactionInput' +import { apiGet, apiPost } from '../../apis/loginAPI' + +@Resolver() +export class TransactionResolver { + @Query(() => TransactionList) + async transactionList( + @Args() { sessionId, firstPage = 1, items = 25, order = 'DESC' }: TransactionListInput, + ): Promise { + const result = await apiGet( + `${CONFIG.COMMUNITY_API_URL}listTransactions/${firstPage}/${items}/${order}/${sessionId}`, + ) + if (!result.success) throw new Error(result.data) + return new TransactionList(result.data) + } + + @Query(() => String) + async sendCoins( + @Args() { sessionId, email, amount, memo }: TransactionSendArgs, + ): Promise { + const payload = { + session_id: sessionId, + email, + amount, + memo, + auto_sign: true, + } + const result = await apiPost(CONFIG.COMMUNITY_API_URL + 'sendCoins', payload) + if (!result.success) { + throw new Error(result.data) + } + return 'success' + } +} diff --git a/backend/src/graphql/resolvers/UserResolver.ts b/backend/src/graphql/resolvers/UserResolver.ts index d22dd49ac..4361bd0ed 100644 --- a/backend/src/graphql/resolvers/UserResolver.ts +++ b/backend/src/graphql/resolvers/UserResolver.ts @@ -1,13 +1,11 @@ // import jwt from 'jsonwebtoken' -import { Resolver, Query, /* Mutation, */ Args, Arg } from 'type-graphql' +import { Resolver, Query, Args, Arg } from 'type-graphql' import CONFIG from '../../config' -import { ChangePasswordResponse } from '../models/ChangePasswordResponse' import { CheckUsernameResponse } from '../models/CheckUsernameResponse' -import { CreateResponse } from '../models/CreateResponse' import { GetUserInfoResponse } from '../models/UserInfoData' import { LoginResponse } from '../models/LoginResponse' import { LoginViaVerificationCode } from '../models/LoginViaVerificationCode' -import { SendEmailResponse } from '../models/SendEmailResponse' +import { SendPasswordResetEmailResponse } from '../models/SendPasswordResetEmailResponse' import { UpdateUserInfosResponse } from '../models/UpdateUserInfosResponse' import { ChangePasswordArgs, @@ -23,7 +21,6 @@ import { apiPost, apiGet } from '../../apis/loginAPI' @Resolver() export class UserResolver { @Query(() => LoginResponse) - // eslint-disable-next-line @typescript-eslint/no-explicit-any async login(@Args() { email, password }: UnsecureLoginArgs): Promise { email = email.trim().toLowerCase() const result = await apiPost(CONFIG.LOGIN_API_URL + 'unsecureLogin', { email, password }) @@ -51,7 +48,6 @@ export class UserResolver { } @Query(() => LoginViaVerificationCode) - // eslint-disable-next-line @typescript-eslint/no-explicit-any async loginViaEmailVerificationCode( @Arg('optin') optin: string, ): Promise { @@ -66,21 +62,18 @@ export class UserResolver { return new LoginViaVerificationCode(result.data) } - /* @Query(() => LogoutResponse) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async logout(@Arg('sessionId') sessionId: number): Promise { + @Query(() => String) + async logout(@Arg('sessionId') sessionId: number): Promise { const payload = { session_id: sessionId } - const result = apiPost(CONFIG.LOGIN_API_URL + 'logout', payload) + const result = await apiPost(CONFIG.LOGIN_API_URL + 'logout', payload) if (!result.success) { throw new Error(result.data) } - return result.data + return 'success' } -*/ - @Query(() => CreateResponse) - async create( - @Args() { email, firstName, lastName, password }: CreateUserArgs, - ): Promise { + + @Query(() => String) + async create(@Args() { email, firstName, lastName, password }: CreateUserArgs): Promise { const payload = { email, first_name: firstName, @@ -93,23 +86,27 @@ export class UserResolver { if (!result.success) { throw new Error(result.data) } - return new CreateResponse(result.data) + return 'success' } - @Query(() => SendEmailResponse) - async sendEmail( + // TODO + @Query(() => SendPasswordResetEmailResponse) + async sendResetPasswordEmail( @Args() { email, emailText = 7, emailVerificationCodeType = 'resetPassword' }: SendEmailArgs, - ): Promise { + ): Promise { const payload = { email, email_text: emailText, email_verification_code_type: emailVerificationCodeType, } - return apiPost(CONFIG.LOGIN_API_URL + 'sendEmail', payload) + const response = await apiPost(CONFIG.LOGIN_API_URL + 'sendEmail', payload) + if (!response.success) throw new Error(response.data) + return new SendPasswordResetEmailResponse(response.data) } @Query(() => GetUserInfoResponse) + // eslint-disable-next-line @typescript-eslint/no-explicit-any async getUserInfos(@Args() { sessionId, email }: GetUserInfoArgs): Promise { const payload = { session_id: sessionId, @@ -119,16 +116,19 @@ export class UserResolver { return apiPost(CONFIG.LOGIN_API_URL + 'getUserInfos', payload) } - @Query(() => ChangePasswordResponse) - async changePassword(@Args() { sessionId, email, password }: ChangePasswordArgs): Promise { + @Query(() => String) + async resetPassword( + @Args() + { sessionId, email, password }: ChangePasswordArgs, + ): Promise { const payload = { session_id: sessionId, email, password, } const result = await apiPost(CONFIG.LOGIN_API_URL + 'resetPassword', payload) - if (result.success) return result.result.data.state - return result.result + if (!result.success) throw new Error(result.data) + return 'sucess' } @Query(() => UpdateUserInfosResponse) @@ -137,32 +137,39 @@ export class UserResolver { { sessionId, email, - firstName, - lastName, - username, - language, - password, - passwordNew, + firstName = '', + lastName = '', + username = '', + language = '', + password = '', + passwordNew = '', }: UpdateUserInfosArgs, - ): Promise { + ): Promise { const payload = { session_id: sessionId, email, update: { - 'User.first_name': firstName, - 'User.last_name': lastName, - // 'User.description': data.description, - 'User.username': username, - 'User.language': language, - 'User.password_old': password, - 'User.password': passwordNew, + 'User.first_name': firstName !== '' ? firstName : undefined, + 'User.last_name': lastName !== '' ? lastName : undefined, + 'User.username': username !== '' ? username : undefined, + 'User.language': language !== '' ? language : undefined, + 'User.password': passwordNew !== '' ? passwordNew : undefined, + 'User.password_old': password !== '' ? password : undefined, }, } - return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) + const result = await apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload) + if (!result.success) throw new Error(result.data) + return new UpdateUserInfosResponse(result.data) } @Query(() => CheckUsernameResponse) - async checkUsername(@Args() { username, groupId = 1 }: CheckUsernameArgs): Promise { - return apiGet(CONFIG.LOGIN_API_URL + `checkUsername?username=${username}&group_id=${groupId}`) + async checkUsername( + @Args() { username, groupId = 1 }: CheckUsernameArgs, + ): Promise { + const response = await apiGet( + CONFIG.LOGIN_API_URL + `checkUsername?username=${username}&group_id=${groupId}`, + ) + if (!response.success) throw new Error(response.data) + return new CheckUsernameResponse(response.data) } } diff --git a/backend/src/graphql/resolvers/helpers/MapVariableToColumnName.ts b/backend/src/graphql/resolvers/helpers/MapVariableToColumnName.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/backend/src/index.ts b/backend/src/index.ts index cbc457002..cd06754ef 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -9,19 +9,17 @@ import CONFIG from './config' // import { BookResolver } from './graphql/resolvers/BookResolver' import { UserResolver } from './graphql/resolvers/UserResolver' import { CommunityTransactionResolver } from './graphql/resolvers/CommunityTransactionResolver' +import { BalanceResolver } from './graphql/resolvers/BalanceResolver' import { GdtResolver } from './graphql/resolvers/GdtResolver' -// import { GroupResolver } from './graphql/resolvers/GroupResolver' +import { TransactionResolver } from './graphql/resolvers/TransactionResolver' + // TODO implement // import queryComplexity, { simpleEstimator, fieldConfigEstimator } from "graphql-query-complexity"; async function main() { // const connection = await createConnection() const schema = await buildSchema({ - resolvers: [ - /* BookResolver , GroupResolver, */ UserResolver, - CommunityTransactionResolver, - GdtResolver, - ], + resolvers: [UserResolver, BalanceResolver, TransactionResolver, GdtResolver], }) // Graphiql interface