Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"@corecodeio/libraries": "^1.0.5",
"apollo-server-express": "^2.16.1",
"awesome-phonenumber": "^2.37.1",
"axios": "^0.21.0",
"convict": "^6.0.0",
"express": "^4.17.1",
"express-jwt": "^6.0.0",
Expand Down
55 changes: 55 additions & 0 deletions api/src/__test__/feature/onboarding/resolver/registerStore.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { MutationVerifyPhoneNumberCode } from "@corecodeio/libraries/api/onboarding";
import { Dependencies } from "@corecodeio/libraries/di";
import { createTestClient } from "apollo-server-testing";
import axios from "axios";
import * as faker from "faker";
import { createApolloServer } from "../../../../server";
import { TwilioSMSVerificationInjectionKey } from "../../../../util/twilio/InjectionKeys";
import { ISMSVerification } from "../../../../util/twilio/interface/ISMSVerification";
import { smsVerificationMock } from "../../../mock/smsVerificationMock";

const dependencies = new Dependencies();
const apolloServer = createApolloServer(dependencies);

dependencies.override<ISMSVerification>(
TwilioSMSVerificationInjectionKey,
smsVerificationMock
);

describe("registerStore", () => {
test("success", async () => {
const { mutate } = createTestClient(apolloServer);

const res = await mutate({
mutation: MutationVerifyPhoneNumberCode,
variables: {
input: {
phoneNumber: faker.phone.phoneNumber("+5023#######"),
code: "123",
},
},
});

const token = res.data.verifyPhoneNumberCode.token;

const result = await axios("http://localhost:8001/graphql", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`,
},
data: JSON.stringify({
query: `
mutation RegisterStore($input: RegisterStoreInput!) {
registerStore(input: $input)
}
`,
variables: {
input: {
url: "https://www.amazon.com",
},
},
}),
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@ import * as faker from "faker";
import { createApolloServer } from "../../../../server";
import { TwilioSMSVerificationInjectionKey } from "../../../../util/twilio/InjectionKeys";
import { ISMSVerification } from "../../../../util/twilio/interface/ISMSVerification";
import { smsVerificationMock } from "../../../mock/smsVerificationMock";

const dependencies = new Dependencies();
const apolloServer = createApolloServer(dependencies);

dependencies.override<ISMSVerification>(TwilioSMSVerificationInjectionKey, {
send: jest.fn(() => Promise.resolve(true)),
verify: jest.fn(() => Promise.resolve(true)),
});
dependencies.override<ISMSVerification>(
TwilioSMSVerificationInjectionKey,
smsVerificationMock
);

describe("sendPhoneNumberVerificationCode", () => {
test("Should return a response with code 200", async () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@ import * as faker from "faker";
import { createApolloServer } from "../../../../server";
import { TwilioSMSVerificationInjectionKey } from "../../../../util/twilio/InjectionKeys";
import { ISMSVerification } from "../../../../util/twilio/interface/ISMSVerification";
import { smsVerificationMock } from "../../../mock/smsVerificationMock";

const dependencies = new Dependencies();
const apolloServer = createApolloServer(dependencies);

dependencies.override<ISMSVerification>(TwilioSMSVerificationInjectionKey, {
send: jest.fn(() => Promise.resolve(true)),
verify: jest.fn(() => Promise.resolve(true)),
});
dependencies.override<ISMSVerification>(
TwilioSMSVerificationInjectionKey,
smsVerificationMock
);

describe("verifyPhoneNumberCode", () => {
test("Should return a response of type OnboardingSession", async () => {
Expand Down
4 changes: 4 additions & 0 deletions api/src/__test__/mock/smsVerificationMock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export const smsVerificationMock = {
send: jest.fn(() => Promise.resolve(true)),
verify: jest.fn(() => Promise.resolve(true)),
};
9 changes: 4 additions & 5 deletions api/src/feature/onboarding/controller/OnboardingController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,9 @@ export class OnboardingController implements IOnboardingController {
}

async verifyPhoneNumberCode({ phoneNumber, code }) {
const isTwilioVerified = await this.twilioSMSVerification.verify(
phoneNumber,
code
);
const isTwilioVerified = this.verifiedPhoneNumbers.includes(phoneNumber)
? true
: await this.twilioSMSVerification.verify(phoneNumber, code);

if (!isTwilioVerified) {
throw new Error("Error al verificar");
Expand All @@ -50,7 +49,7 @@ export class OnboardingController implements IOnboardingController {
}

async sendPhoneNumberVerificationCode({ phoneNumber }) {
if (await this.verifiedPhoneNumbers.includes(phoneNumber)) {
if (this.verifiedPhoneNumbers.includes(phoneNumber)) {
return true;
}

Expand Down
2 changes: 2 additions & 0 deletions api/src/feature/onboarding/resolver/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { registerStore } from "./registerStore";
import { sendPhoneNumberVerificationCode } from "./sendPhoneNumberVerificationCode";
import { verifyPhoneNumberCode } from "./verifyPhoneNumberCode";

Expand All @@ -7,4 +8,5 @@ export const queries = {

export const mutations = {
verifyPhoneNumberCode,
registerStore,
};
13 changes: 13 additions & 0 deletions api/src/feature/onboarding/resolver/registerStore.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { MutationResolvers } from "@corecodeio/libraries/api";
import { IContext } from "../../../server/interface/IContext";

export const registerStore: MutationResolvers<
IContext
>["registerStore"] = async (parent, { input }, { dependencies, req }) => {
try {
// req.headers.authorization;
return true;
} catch (error) {
return error;
}
};
24 changes: 12 additions & 12 deletions api/src/server/createApolloServer.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { IDependencies } from "@corecodeio/libraries/di";
import { ApolloServer } from "apollo-server-express";
import { IContext } from "./interface/IContext";
import { resolvers } from "./resolvers";
import { schema as typeDefs } from "./schema";
import { IDependencies } from '@corecodeio/libraries/di';
import { ApolloServer } from 'apollo-server-express';
import { IContext } from './interface/IContext';
import { resolvers } from './resolvers';
import { schema as typeDefs } from './schema';

export const createApolloServer = (dependencies: IDependencies) =>
new ApolloServer({
typeDefs,
resolvers,
context: {
dependencies,
} as IContext,
});
new ApolloServer({
typeDefs,
resolvers,
context: (expressContext) => {
return { ...expressContext, dependencies } as IContext;
},
});
7 changes: 4 additions & 3 deletions api/src/server/interface/IContext.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { IDependencies } from "@corecodeio/libraries/di";
import { IDependencies } from '@corecodeio/libraries/di';
import { ExpressContext } from 'apollo-server-express/dist/ApolloServer';

export interface IContext {
dependencies: IDependencies;
export interface IContext extends ExpressContext {
dependencies: IDependencies;
}
44 changes: 23 additions & 21 deletions api/src/server/schema.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,30 @@
import { gql } from "apollo-server-express";
import { gql } from 'apollo-server-express';

export const schema = gql`
type Query {
sendPhoneNumberVerificationCode(
input: SendPhoneNumberVerificatioCodeInput!
): Boolean!
}
type Query {
sendPhoneNumberVerificationCode(input: SendPhoneNumberVerificatioCodeInput!): Boolean!
}

type Mutation {
verifyPhoneNumberCode(
input: VerifyPhoneNumberCodeInput!
): OnboardingSession!
}
type Mutation {
verifyPhoneNumberCode(input: VerifyPhoneNumberCodeInput!): OnboardingSession!

input SendPhoneNumberVerificatioCodeInput {
phoneNumber: String!
}
registerStore(input: RegisterStoreInput!): Boolean!
}

input VerifyPhoneNumberCodeInput {
phoneNumber: String!
code: String!
}
input SendPhoneNumberVerificatioCodeInput {
phoneNumber: String!
}

type OnboardingSession {
token: String!
}
input VerifyPhoneNumberCodeInput {
phoneNumber: String!
code: String!
}

input RegisterStoreInput {
url: String!
}

type OnboardingSession {
token: String!
}
`;
2 changes: 1 addition & 1 deletion api/src/util/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const config = convict({
format: "*",
default: Array(15)
.fill(null)
.map((_, i) => `+5020000000${i}`),
.map((_, i) => `+5023000000${i}`),
env: "VERIFIED_PHONE_NUMBERS",
},
},
Expand Down
12 changes: 12 additions & 0 deletions api/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2029,6 +2029,13 @@ axios@^0.19.2:
dependencies:
follow-redirects "1.5.10"

axios@^0.21.0:
version "0.21.0"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.0.tgz#26df088803a2350dff2c27f96fef99fe49442aca"
integrity sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==
dependencies:
follow-redirects "^1.10.0"

babel-jest@^26.1.0:
version "26.1.0"
resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.1.0.tgz#b20751185fc7569a0f135730584044d1cb934328"
Expand Down Expand Up @@ -3387,6 +3394,11 @@ follow-redirects@1.5.10:
dependencies:
debug "=3.1.0"

follow-redirects@^1.10.0:
version "1.13.0"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db"
integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==

for-in@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
Expand Down
32 changes: 26 additions & 6 deletions native/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,36 @@ import {
DependencyContext,
} from "./src/common/context/DependencyContext";
import OnboardingNavigator from "./src/navigation/navigator/OnboardingNavigator";
import { AuthTokenInjectionKey } from "./src/util/auth/InjectionKey";

const client = new ApolloClient({
uri: `http://localhost:8001/graphql`,
cache: new InMemoryCache(),
});
/**
* rxjs observer https://rxjs-dev.firebaseapp.com/guide/overview
* behavior subject
* useState
* useEffect
*/

export const App: React.FC = () => {
const authToken = dependencies.provide(AuthTokenInjectionKey);

const token = authToken.useAuthToken();

const getApolloClient = () => {
const options = {
uri: `http://49f093574f64.ngrok.io/graphql`,
cache: new InMemoryCache(),
};

if (Boolean(token)) {
options["headers"] = { authorization: `Bearer ${token}` };
}

return new ApolloClient(options);
};

export const App: React.FC<{}> = () => {
return (
<DependencyContext.Provider value={dependencies}>
<ApolloProvider client={client}>
<ApolloProvider client={getApolloClient()}>
<NavigationContainer>
<OnboardingNavigator />
</NavigationContainer>
Expand Down
5 changes: 2 additions & 3 deletions native/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
},
"dependencies": {
"@apollo/client": "^3.1.3",
"@corecodeio/libraries": "1.0.5",
"@corecodeio/libraries": "file:../../libraries/lib",
"@react-native-community/masked-view": "0.1.10",
"@react-navigation/native": "^5.7.1",
"@react-navigation/stack": "^5.7.1",
Expand All @@ -26,11 +26,11 @@
"react-native": "https://github.com/expo/react-native/archive/sdk-38.0.2.tar.gz",
"react-native-confirmation-code-field": "^6.5.0",
"react-native-gesture-handler": "~1.6.0",
"react-native-phone-number-input": "^1.1.0",
"react-native-reanimated": "~1.9.0",
"react-native-safe-area-context": "~3.0.7",
"react-native-screens": "~2.9.0",
"react-native-web": "~0.11.7",
"react-phone-number-input": "^3.0.25",
"rxjs": "^6.6.3",
"styled-components": "^5.1.1",
"styled-system": "^5.1.5"
Expand All @@ -39,7 +39,6 @@
"@babel/core": "^7.8.6",
"@types/react": "~16.9.41",
"@types/react-native": "~0.62.13",
"@types/react-phone-number-input": "^3.0.5",
"jest-expo": "^38.0.2",
"typescript": "~3.9.5"
},
Expand Down
6 changes: 3 additions & 3 deletions native/src/feature/onboarding/component/CodeInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
} from "react-native-confirmation-code-field";
import styles from "./styles";

const CELL_COUNT = 6;
export const CELL_COUNT = 6;

type Props = {
onChangeText: (text: string) => void | undefined;
Expand All @@ -22,7 +22,7 @@ const CodeInput: React.FC<Props> = ({ onChangeText }) => {
setValue,
});

const onSetVerifcationCode = (code: string) => {
const onSetVerificationCode = (code: string) => {
onChangeText(code);
setValue(code);
};
Expand All @@ -32,7 +32,7 @@ const CodeInput: React.FC<Props> = ({ onChangeText }) => {
{...props}
ref={ref}
value={value}
onChangeText={onSetVerifcationCode}
onChangeText={onSetVerificationCode}
cellCount={CELL_COUNT}
rootStyle={styles.codeFiledRoot}
keyboardType="number-pad"
Expand Down
Loading