Working on arthome

This commit is contained in:
2024-08-25 18:33:37 +02:00
parent a5120d006a
commit a1e31a89a7
49 changed files with 3139 additions and 284 deletions

View File

@@ -2,17 +2,85 @@ export default oauthGitHubEventHandler({
config: {
emailRequired: true,
},
async onSuccess(event, { user }) {
await setUserSession(event, {
user: {
email: user.email,
name: user.name,
},
async onSuccess(event, { user: oauthUser, tokens }) {
const userSession = await getUserSession(event)
// If the user is already signed in, link the account
if (userSession?.id) {
const user = await findUserById(userSession.id)
if (user) {
await updateUser(userSession.id, {
githubId: oauthUser.id,
githubToken: tokens.access_token,
})
await setUserSession(event, {
id: userSession.id,
user: userSession,
githubId: oauthUser.id,
})
return sendRedirect(event, '/')
}
}
// If the user is not signed in, search for an existing user with that GitHub ID
// If it exists, sign in as that user and refresh the token
let user = await findUserByGitHubId(oauthUser.id)
if (user) {
await updateUser(user.id, {
githubId: oauthUser.id,
githubToken: tokens.access_token,
})
await setUserSession(event, {
id: user.id,
user,
})
return sendRedirect(event, '/')
}
// If the user is not signed in, search for an existing user with that email address without a GitHub ID
// If it exists, tells the user to sign in with that account and link the GitHub account
user = await findUserBy(
and(
eq(tables.users.email, oauthUser.email),
isNull(tables.users.githubId),
),
)
if (user) {
await updateSession(event, {
password: useRuntimeConfig(event).session.password,
}, {
message: 'An existing account for this email already exists. Please login and visit your profile settings to add support for GitHub authentication.',
})
return sendRedirect(event, '/login')
}
// If the user is not signed in and no user exists with that GitHub ID or email address, create a new user
const createdUser = await createUser({
username: oauthUser.login as string,
description: oauthUser.bio as string,
name: oauthUser.name as string,
email: oauthUser.email as string,
avatar: oauthUser.avatar_url as string,
githubId: oauthUser.id as number,
githubToken: tokens.access_token as string,
language: 'en-US',
location: 'unknown',
private: false,
subscription: 'free',
})
return sendRedirect(event, '/home')
},
onError(event, error) {
console.error('GitHub OAuth error:', error)
await setUserSession(event, {
id: createdUser.id,
user: createdUser,
})
return sendRedirect(event, '/')
},
})

View File

@@ -2,17 +2,85 @@ export default oauthGoogleEventHandler({
config: {
emailRequired: true,
},
async onSuccess(event, { user }) {
await setUserSession(event, {
user: {
email: user.email,
name: user.name,
},
async onSuccess(event, { user: oauthUser, tokens }) {
const userSession = await getUserSession(event)
// If the user is already signed in, link the account
if (userSession?.id) {
const user = await findUserById(userSession.id)
if (user) {
await updateUser(userSession.id, {
googleId: oauthUser.sub,
googleToken: tokens.access_token,
})
await replaceUserSession(event, {
id: userSession.id,
user: userSession,
googleId: oauthUser.sub,
})
return sendRedirect(event, '/')
}
}
// If the user is not signed in, search for an existing user with that Google ID
// If it exists, sign in as that user and refresh the token
let user = await findUserByGoogleId(oauthUser.sub)
if (user) {
await updateUser(user.id, {
googleId: oauthUser.sub,
googleToken: tokens.access_token,
})
await replaceUserSession(event, {
id: user.id,
user,
})
return sendRedirect(event, '/')
}
// If the user is not signed in, search for an existing user with that email address without a Google ID
// If it exists, tells the user to sign in with that account and link the Google account
user = await findUserBy(
and(
eq(tables.users.email, oauthUser.email),
isNull(tables.users.googleId),
),
)
if (user) {
await updateSession(event, {
password: useRuntimeConfig(event).session.password,
}, {
message: 'An existing account for this email already exists. Please login and visit your profile settings to add support for Google authentication.',
})
return sendRedirect(event, '/login')
}
// If the user is not signed in and no user exists with that Google ID or email address, create a new user
const createdUser = await createUser({
username: oauthUser.name as string,
description: '',
name: `${oauthUser.given_name} ${oauthUser.family_name}`,
email: oauthUser.email as string,
avatar: oauthUser.picture as string,
googleId: oauthUser.sub as number,
googleToken: tokens.access_token as string,
language: 'en-US',
location: 'unknown',
private: false,
subscription: 'free',
})
return sendRedirect(event, '/home')
},
onError(event, error) {
console.error('Google OAuth error:', error)
await replaceUserSession(event, {
id: createdUser.id,
user: createdUser,
})
return sendRedirect(event, '/')
},
})

View File

@@ -0,0 +1,5 @@
export default eventHandler(async (event) => {
const { pathname } = getRouterParams(event)
return hubBlob().serve(event, pathname)
})