diff --git a/backend/src/apis/KlicktippController.ts b/backend/src/apis/KlicktippController.ts index c47c7b911..7c4969f45 100644 --- a/backend/src/apis/KlicktippController.ts +++ b/backend/src/apis/KlicktippController.ts @@ -1,40 +1,53 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { KlicktippConnector } from './klicktippConnector' import CONFIG from '../config' -export class KlicktippController { - private klicktippConnector: KlicktippConnector +const klicktippConnector = new KlicktippConnector() - constructor(service?: string) { - this.klicktippConnector = new KlicktippConnector(service) - } +export const signin = async (email: string, language: string): Promise => { + const fields = {} + const apiKey = language === 'de' ? CONFIG.KLICKTIPP_APIKEY_DE : CONFIG.KLICKTIPP_APIKEY_EN + const result = await klicktippConnector.signin(apiKey, email, fields) + return result +} - async signin(email: string, language: string): Promise { - const fields = {} - const apiKey = language === 'de' ? CONFIG.KLICKTIPP_APIKEY_DE : CONFIG.KLICKTIPP_APIKEY_EN - const result = await this.klicktippConnector.signin(apiKey, email, fields) +export const signout = async (email: string, language: string): Promise => { + const apiKey = language === 'de' ? CONFIG.KLICKTIPP_APIKEY_DE : CONFIG.KLICKTIPP_APIKEY_EN + const result = await klicktippConnector.signoff(apiKey, email) + return result +} + +export const userTags = async (email: string): Promise => { + const isLogin = await loginKlicktippUser() + if (isLogin) { + const subscriberId = await klicktippConnector.subscriberSearch(email) + const result = await klicktippConnector.subscriberGet(subscriberId) + await logoutKlicktippUser() return result } - - async signout(email: string, language: string): Promise { - const apiKey = language === 'de' ? CONFIG.KLICKTIPP_APIKEY_DE : CONFIG.KLICKTIPP_APIKEY_EN - const result = await this.klicktippConnector.signoff(apiKey, email) - return result - } - - async userTags(email: string): Promise { - await this.loginKlicktippUser() - const subscriberId = await this.klicktippConnector.subscriberSearch(email) - const result = await this.klicktippConnector.subscriberGet(subscriberId) - console.log('The subscriber with the id: ', subscriberId, result) - return result - } - - private async loginKlicktippUser() { - return await this.klicktippConnector.login(CONFIG.KLICKTIPP_USER, CONFIG.KLICKTIPP_PASSWORD) - } - - async untagUser(email: string, tagid: string) { - await this.loginKlicktippUser() - return await this.klicktippConnector.untag(email, tagid) - } +} + +export const loginKlicktippUser = async (): Promise => { + return await klicktippConnector.login(CONFIG.KLICKTIPP_USER, CONFIG.KLICKTIPP_PASSWORD) +} + +export const logoutKlicktippUser = async (): Promise => { + return await klicktippConnector.logout() +} + +export const untagUser = async (email: string, tagid: string): Promise => { + const isLogin = await loginKlicktippUser() + if (isLogin) { + return await klicktippConnector.untag(email, tagid) + } + return false +} + +export const tagUser = async (email: string, tagids: string): Promise => { + const isLogin = await loginKlicktippUser() + if (isLogin) { + return await klicktippConnector.tag(email, tagids) + } + return false } diff --git a/backend/src/apis/klicktippConnector.ts b/backend/src/apis/klicktippConnector.ts index f72ae780b..d170e065e 100644 --- a/backend/src/apis/klicktippConnector.ts +++ b/backend/src/apis/klicktippConnector.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import axios, { AxiosRequestConfig, Method } from 'axios' export class KlicktippConnector { diff --git a/backend/src/graphql/models/CheckEmailResponse.ts b/backend/src/graphql/models/CheckEmailResponse.ts new file mode 100644 index 000000000..be92951de --- /dev/null +++ b/backend/src/graphql/models/CheckEmailResponse.ts @@ -0,0 +1,21 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +import { ObjectType, Field } from 'type-graphql' + +@ObjectType() +export class CheckEmailResponse { + constructor(json: any) { + this.sessionId = json.session_id + this.email = json.user.email + this.language = json.user.language + } + + @Field(() => Number) + sessionId: number + + @Field(() => String) + email: string + + @Field(() => String) + language: string +} diff --git a/backend/src/graphql/resolvers/UserResolver.ts b/backend/src/graphql/resolvers/UserResolver.ts index d2d74d3d9..4233aadb4 100644 --- a/backend/src/graphql/resolvers/UserResolver.ts +++ b/backend/src/graphql/resolvers/UserResolver.ts @@ -16,14 +16,12 @@ import { UpdateUserInfosArgs, } from '../inputs/LoginUserInput' import { apiPost, apiGet } from '../../apis/HttpRequest' -import { KlicktippController } from '../../apis/KlicktippController' -import { registerMiddleware } from '../../middleware/registerMiddleware' +import { klicktippRegistrationMiddleware } from '../../middleware/klicktippMiddleware' import encode from '../../jwt/encode' +import { CheckEmailResponse } from '../models/CheckEmailResponse' @Resolver() export class UserResolver { - private connector: KlicktippController = new KlicktippController(CONFIG.KLICKTTIPP_API_URL) - @Query(() => String) async login(@Args() { email, password }: UnsecureLoginArgs): Promise { email = email.trim().toLowerCase() @@ -67,7 +65,6 @@ export class UserResolver { } @Query(() => String) - @UseMiddleware(registerMiddleware) async create( @Args() { email, firstName, lastName, password, language }: CreateUserArgs, ): Promise { @@ -165,4 +162,14 @@ export class UserResolver { if (!response.success) throw new Error(response.data) return new CheckUsernameResponse(response.data) } + + @Query(() => CheckEmailResponse) + @UseMiddleware(klicktippRegistrationMiddleware) + async checkEmail(@Arg('optin') optin: string): Promise { + const result = await apiGet(CONFIG.LOGIN_API_URL + 'checkEmail/' + optin) + if (!result.success) { + throw new Error(result.data) + } + return new CheckEmailResponse(result.data) + } } diff --git a/backend/src/middleware/klicktippMiddleware.ts b/backend/src/middleware/klicktippMiddleware.ts new file mode 100644 index 000000000..2fdeab33d --- /dev/null +++ b/backend/src/middleware/klicktippMiddleware.ts @@ -0,0 +1,15 @@ +import { MiddlewareFn } from 'type-graphql' +import { signin } from '../apis/KlicktippController' + +export const klicktippRegistrationMiddleware: MiddlewareFn = async ( + // Only for demo + /* eslint-disable-next-line @typescript-eslint/no-unused-vars */ + { root, args, context, info }, + next, +) => { + // Do Something here before resolver is called + const result = await next() + // Do Something here after resolver is completed + signin(result.data.checkEmail.email, result.data.checkEmail.language) + return result +} diff --git a/backend/src/middleware/registerMiddleware.ts b/backend/src/middleware/registerMiddleware.ts deleted file mode 100644 index 7b64a6243..000000000 --- a/backend/src/middleware/registerMiddleware.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { MiddlewareFn } from 'type-graphql' - -/* eslint-disable-next-line @typescript-eslint/no-unused-vars */ -export const registerMiddleware: MiddlewareFn = async ({ root, args, context, info }, next) => { - const result = await next() - // do something here - return result -}