@@ -2,8 +2,11 @@ import { Context } from "../context";
2
2
import {
3
3
checkPhoneNumberVerificationCode,
4
4
generatePhoneNumberHash,
5
- startPhoneNumberVerification
5
+ generatePhoneNumberToken,
6
+ startPhoneNumberVerification,
7
+ validatePhoneNumberToken
6
8
} from "../phone";
9
+ import { normalizeUsername } from "../usernames";
7
10
import { web3 } from "../web3/client";
8
11
9
12
export const Mutation = {
@@ -12,69 +15,128 @@ export const Mutation = {
12
15
{ input }: { input: { phoneNumber: string } },
13
16
ctx: Context
14
17
) {
15
- await startPhoneNumberVerification(input.phoneNumber);
16
- return { ok: true };
18
+ try {
19
+ await startPhoneNumberVerification(input.phoneNumber);
20
+ return { ok: true };
21
+ } catch (err) {
22
+ return {
23
+ message: err.message,
24
+ ok: false
25
+ };
26
+ }
17
27
},
18
- async updatePhoneNumber (
28
+ async checkPhoneNumberVerification (
19
29
parent,
20
30
{
21
31
input
22
32
}: {
23
33
input: {
24
34
phoneNumber: string;
25
35
verificationCode: string;
36
+ };
37
+ },
38
+ ctx: Context,
39
+ info
40
+ ) {
41
+ try {
42
+ await checkPhoneNumberVerificationCode(
43
+ input.phoneNumber,
44
+ input.verificationCode
45
+ );
46
+
47
+ const {
48
+ hashedPhoneNumber,
49
+ phoneNumberToken,
50
+ phoneNumberTokenExpires
51
+ } = await generatePhoneNumberToken(input.phoneNumber);
52
+
53
+ return {
54
+ ok: true,
55
+ phoneNumber: ctx.db.query.phoneNumber(
56
+ {
57
+ where: { hashedPhoneNumber }
58
+ },
59
+ // a bit of a hack since I'm not sure what to do with info here
60
+ `{
61
+ hashedPhoneNumber
62
+ address
63
+ createdAt
64
+ updatedAt
65
+ }`
66
+ ),
67
+ phoneNumberToken,
68
+ phoneNumberTokenExpires
69
+ };
70
+ } catch (err) {
71
+ return {
72
+ message: err.message,
73
+ ok: false
74
+ };
75
+ }
76
+ },
77
+ async updatePhoneNumber(
78
+ parent,
79
+ {
80
+ input
81
+ }: {
82
+ input: {
83
+ phoneNumberToken: string;
26
84
address: string;
27
85
};
28
86
},
29
87
ctx: Context,
30
88
info
31
89
) {
32
- await checkPhoneNumberVerificationCode(
33
- input.phoneNumber,
34
- input.verificationCode
35
- );
90
+ try {
91
+ const hashedPhoneNumber = await validatePhoneNumberToken(
92
+ input.phoneNumberToken
93
+ );
36
94
37
- const hashedPhoneNumber = generatePhoneNumberHash(input.phoneNumber);
38
- return {
39
- phoneNumber: ctx.db.mutation.upsertPhoneNumber(
40
- {
41
- create: { hashedPhoneNumber, address: input.address },
42
- update: { address: input.address },
43
- where: { hashedPhoneNumber }
44
- },
45
- // a bit of a hack since I'm not sure what to do with info here
46
- `{
47
- hashedPhoneNumber
48
- address
49
- createdAt
50
- updatedAt
51
- }`
52
- )
53
- };
95
+ return {
96
+ ok: true,
97
+ phoneNumber: ctx.db.mutation.upsertPhoneNumber(
98
+ {
99
+ create: { hashedPhoneNumber, address: input.address },
100
+ update: { address: input.address },
101
+ where: { hashedPhoneNumber }
102
+ },
103
+ // a bit of a hack since I'm not sure what to do with info here
104
+ `{
105
+ hashedPhoneNumber
106
+ address
107
+ createdAt
108
+ updatedAt
109
+ }`
110
+ )
111
+ };
112
+ } catch (err) {
113
+ return { message: err.message, ok: false };
114
+ }
54
115
},
55
116
async deletePhoneNumber(
56
117
parent,
57
118
{
58
119
input
59
120
}: {
60
121
input: {
61
- phoneNumber: string;
62
- verificationCode: string;
122
+ phoneNumberToken: string;
63
123
};
64
124
},
65
125
ctx: Context
66
126
) {
67
- await checkPhoneNumberVerificationCode(
68
- input.phoneNumber,
69
- input.verificationCode
70
- );
127
+ try {
128
+ const hashedPhoneNumber = await validatePhoneNumberToken(
129
+ input.phoneNumberToken
130
+ );
71
131
72
- const hashedPhoneNumber = generatePhoneNumberHash(input.phoneNumber);
73
- await ctx.db.mutation.deletePhoneNumber({
74
- where: { hashedPhoneNumber }
75
- });
132
+ await ctx.db.mutation.deletePhoneNumber({
133
+ where: { hashedPhoneNumber }
134
+ });
76
135
77
- return { ok: true };
136
+ return { ok: true };
137
+ } catch (err) {
138
+ return { message: err.message, ok: false };
139
+ }
78
140
},
79
141
async sendRawEthereumTransaction(parent, { input }, ctx) {
80
142
const hash = await web3[input.network].eth.sendRawTransaction(input);
@@ -84,5 +146,49 @@ export const Mutation = {
84
146
network: input.network
85
147
})
86
148
};
149
+ },
150
+ async checkUsernameAvailable(parent, { input }, ctx) {
151
+ try {
152
+ const username = await normalizeUsername(input.username);
153
+ const address = await ctx.loaders.web3.address.load({
154
+ address: username,
155
+ network: input.network || "MAINNET"
156
+ });
157
+
158
+ if (address) {
159
+ return { message: "username is taken", ok: false };
160
+ }
161
+
162
+ return { ok: true };
163
+ } catch (err) {
164
+ return { message: err.message, ok: false };
165
+ }
166
+ },
167
+ async createIdentityContract(parent, { input }, ctx) {
168
+ try {
169
+ const username = await normalizeUsername(input.username);
170
+ const address = await ctx.loaders.web3.address.load({
171
+ address: username,
172
+ network: input.network || "MAINNET"
173
+ });
174
+
175
+ if (address) {
176
+ return { message: "username is taken", ok: false };
177
+ }
178
+
179
+ const hashedPhoneNumber = await validatePhoneNumberToken(
180
+ input.phoneNumberToken
181
+ );
182
+
183
+ if (input.managerAddresses.length === 0) {
184
+ return { message: "need at least one manager address", ok: false };
185
+ }
186
+
187
+ // TODO: Create the identity contract and return its address.
188
+
189
+ return { ok: true };
190
+ } catch (err) {
191
+ return { message: err.message, ok: false };
192
+ }
87
193
}
88
194
};
0 commit comments