Skip to content

Commit c01f1bf

Browse files
committed
(book/*) invitation refactor for logged-in user
1 parent 28df3bf commit c01f1bf

File tree

36 files changed

+130
-150
lines changed

36 files changed

+130
-150
lines changed

book/10-begin/api/server/api/public.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,12 @@ router.post('/get-user-by-slug', async (req, res, next) => {
2626
}
2727
});
2828

29-
router.get('/invitations/accept-and-get-team-by-token', async (req, res, next) => {
29+
router.get('/invitations/get-team-by-token', async (req, res, next) => {
3030
const token = req.query.token as string;
3131

3232
try {
3333
const team = await Invitation.getTeamByToken({ token });
3434

35-
if (req.user) {
36-
await Invitation.addUserToTeam({ token, user: req.user });
37-
}
38-
39-
team.memberIds.push(req.user.id);
40-
4135
res.json({ team });
4236
} catch (err) {
4337
next(err);

book/10-begin/api/server/models/Invitation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ class InvitationClass extends mongoose.Model {
179179
if (team && !team.memberIds.includes(user._id)) {
180180
await Team.updateOne({ _id: team._id }, { $addToSet: { memberIds: user._id } });
181181

182-
if (user._id !== team.teamLeaderId && !user.defaultTeamSlug) {
182+
if (user._id !== team.teamLeaderId) {
183183
await User.findByIdAndUpdate(user._id, { $set: { defaultTeamSlug: team.slug } });
184184
}
185185
}

book/10-begin/api/server/passwordless-auth.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,12 @@ function setupPasswordless({ server }) {
114114

115115
server.get('/logout', passwordless.logout(), (req, res) => {
116116
req.logout();
117-
res.redirect(`${process.env.URL_APP}/login`);
117+
118+
if (req.query && req.query.invitationToken) {
119+
res.redirect(`${process.env.URL_APP}/invitation?token=${req.query.invitationToken}`);
120+
} else {
121+
res.redirect(`${process.env.URL_APP}/login`);
122+
}
118123
});
119124
}
120125

book/10-begin/app/lib/api/public.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ export const emailLoginLinkApiMethod = ({
2525
body: JSON.stringify({ user: email }),
2626
});
2727

28-
export const acceptAndGetInvitedTeamByTokenApiMethod = (token: string, request) =>
29-
sendRequestAndGetResponse(`${BASE_PATH}/invitations/accept-and-get-team-by-token`, {
28+
export const getTeamByTokenApiMethod = (token: string, request) =>
29+
sendRequestAndGetResponse(`${BASE_PATH}/invitations/get-team-by-token`, {
3030
request,
3131
method: 'GET',
3232
qs: { token },

book/10-begin/app/pages/invitation.tsx

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import React from 'react';
77

88
import LoginButton from '../components/common/LoginButton';
99
import Layout from '../components/layout';
10-
import { acceptAndGetInvitedTeamByTokenApiMethod } from '../lib/api/public';
10+
import { getTeamByTokenApiMethod } from '../lib/api/public';
1111
import { Team } from '../lib/store/team';
1212
import { Store } from '../lib/store';
1313
import withAuth from '../lib/withAuth';
@@ -22,7 +22,7 @@ class InvitationPageComp extends React.Component<Props> {
2222
}
2323

2424
try {
25-
const { team } = await acceptAndGetInvitedTeamByTokenApiMethod(token, ctx.req);
25+
const { team } = await getTeamByTokenApiMethod(token, ctx.req);
2626

2727
return { team, token };
2828
} catch (error) {
@@ -74,18 +74,15 @@ class InvitationPageComp extends React.Component<Props> {
7474
}
7575

7676
public async componentDidMount() {
77-
const { store, team } = this.props;
77+
const { store, team, token } = this.props;
7878

7979
const user = store.currentUser;
8080

8181
if (user && team) {
82-
if (team.memberIds.includes(user._id)) {
83-
const redirectMessage = `Success%21%20You%20are%20now%20part%20of%20${team.name}%20team%2E`;
84-
Router.push(
85-
`/your-settings?teamSlug=${team.slug}&redirectMessage=${redirectMessage}`,
86-
`/teams/${team.slug}/your-settings`,
87-
);
88-
}
82+
Router.push(
83+
`${process.env.NEXT_PUBLIC_URL_API}/logout?invitationToken=${token}`,
84+
`${process.env.NEXT_PUBLIC_URL_API}/logout`,
85+
);
8986
}
9087
}
9188
}

book/10-end/api/server/api/public.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,12 @@ router.post('/get-user-by-slug', async (req, res, next) => {
2626
}
2727
});
2828

29-
router.get('/invitations/accept-and-get-team-by-token', async (req, res, next) => {
29+
router.get('/invitations/get-team-by-token', async (req, res, next) => {
3030
const token = req.query.token as string;
3131

3232
try {
3333
const team = await Invitation.getTeamByToken({ token });
3434

35-
if (req.user) {
36-
await Invitation.addUserToTeam({ token, user: req.user });
37-
}
38-
39-
team.memberIds.push(req.user.id);
40-
4135
res.json({ team });
4236
} catch (err) {
4337
next(err);

book/10-end/api/server/models/Invitation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ class InvitationClass extends mongoose.Model {
183183
if (team && !team.memberIds.includes(user._id)) {
184184
await Team.updateOne({ _id: team._id }, { $addToSet: { memberIds: user._id } });
185185

186-
if (user._id !== team.teamLeaderId && !user.defaultTeamSlug) {
186+
if (user._id !== team.teamLeaderId) {
187187
await User.findByIdAndUpdate(user._id, { $set: { defaultTeamSlug: team.slug } });
188188
}
189189
}

book/10-end/api/server/passwordless-auth.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,16 @@ function setupPasswordless({ server }) {
118118

119119
server.get('/logout', passwordless.logout(), (req, res) => {
120120
req.logout();
121-
res.redirect(`${dev ? process.env.URL_APP : process.env.PRODUCTION_URL_APP}/login`);
121+
122+
if (req.query && req.query.invitationToken) {
123+
res.redirect(
124+
`${dev ? process.env.URL_APP : process.env.PRODUCTION_URL_APP}/invitation?token=${
125+
req.query.invitationToken
126+
}`,
127+
);
128+
} else {
129+
res.redirect(`${dev ? process.env.URL_APP : process.env.PRODUCTION_URL_APP}/login`);
130+
}
122131
});
123132
}
124133

book/10-end/app/lib/api/public.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ export const emailLoginLinkApiMethod = ({
2525
body: JSON.stringify({ user: email }),
2626
});
2727

28-
export const acceptAndGetInvitedTeamByTokenApiMethod = (token: string, request) =>
29-
sendRequestAndGetResponse(`${BASE_PATH}/invitations/accept-and-get-team-by-token`, {
28+
export const getTeamByTokenApiMethod = (token: string, request) =>
29+
sendRequestAndGetResponse(`${BASE_PATH}/invitations/get-team-by-token`, {
3030
request,
3131
method: 'GET',
3232
qs: { token },

book/10-end/app/pages/invitation.tsx

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ import React from 'react';
77

88
import LoginButton from '../components/common/LoginButton';
99
import Layout from '../components/layout';
10-
import { acceptAndGetInvitedTeamByTokenApiMethod } from '../lib/api/public';
10+
import { getTeamByTokenApiMethod } from '../lib/api/public';
1111
import { Team } from '../lib/store/team';
1212
import { Store } from '../lib/store';
1313
import withAuth from '../lib/withAuth';
1414

15+
const dev = process.env.NODE_ENV !== 'production';
16+
1517
type Props = { store: Store; team: Team; token: string };
1618

1719
class InvitationPageComp extends React.Component<Props> {
@@ -22,7 +24,7 @@ class InvitationPageComp extends React.Component<Props> {
2224
}
2325

2426
try {
25-
const { team } = await acceptAndGetInvitedTeamByTokenApiMethod(token, ctx.req);
27+
const { team } = await getTeamByTokenApiMethod(token, ctx.req);
2628

2729
return { team, token };
2830
} catch (error) {
@@ -74,18 +76,19 @@ class InvitationPageComp extends React.Component<Props> {
7476
}
7577

7678
public async componentDidMount() {
77-
const { store, team } = this.props;
79+
const { store, team, token } = this.props;
7880

7981
const user = store.currentUser;
8082

8183
if (user && team) {
82-
if (team.memberIds.includes(user._id)) {
83-
const redirectMessage = `Success%21%20You%20are%20now%20part%20of%20${team.name}%20team%2E`;
84-
Router.push(
85-
`/your-settings?teamSlug=${team.slug}&redirectMessage=${redirectMessage}`,
86-
`/teams/${team.slug}/your-settings`,
87-
);
88-
}
84+
Router.push(
85+
`${
86+
dev ? process.env.NEXT_PUBLIC_URL_API : process.env.NEXT_PUBLIC_PRODUCTION_URL_API
87+
}/logout?invitationToken=${token}`,
88+
`${
89+
dev ? process.env.NEXT_PUBLIC_URL_API : process.env.NEXT_PUBLIC_PRODUCTION_URL_API
90+
}/logout`,
91+
);
8992
}
9093
}
9194
}

0 commit comments

Comments
 (0)