Skip to content
Merged
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
5 changes: 0 additions & 5 deletions .github/agents/git-master.agent.md

This file was deleted.

1 change: 1 addition & 0 deletions packages/backend/src/routes/auth/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,7 @@ export const getAuthRouter = (serviceProvider: ServiceProvider<AppServiceMap>) =
email: userDoc.email,
name: userDoc.name,
avatar: userDoc.avatar,
verifiedAlias: userDoc.verifiedAlias,
role: userDoc.role,
providers: Object.keys(userDoc.providers),
createdAt: userDoc.createdAt,
Expand Down
5 changes: 5 additions & 0 deletions packages/backend/src/services/oauth/oauth.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
async (
_accessToken: string,
_refreshToken: string,
profile: any,

Check warning on line 45 in packages/backend/src/services/oauth/oauth.service.ts

View workflow job for this annotation

GitHub Actions / 🔍 Validate Pull Request

Unexpected any. Specify a different type
done: (error: Error | null, user?: Express.User | false) => void
) => {
try {
Expand All @@ -57,6 +57,7 @@
email,
name: profile.displayName || profile.username || email,
avatar: profile.photos?.[0]?.value,
username: profile.username, // GitHub username for verified alias
});

const expressUser: Express.User = {
Expand All @@ -65,6 +66,7 @@
email: userDoc.email,
displayName: userDoc.name,
avatar: userDoc.avatar,
verifiedAlias: userDoc.verifiedAlias,
providers: userDoc.providers,
role: userDoc.role,
createdAt: userDoc.createdAt,
Expand Down Expand Up @@ -126,6 +128,7 @@
email: userDoc.email,
displayName: userDoc.name,
avatar: userDoc.avatar,
verifiedAlias: userDoc.verifiedAlias,
providers: userDoc.providers,
role: userDoc.role,
createdAt: userDoc.createdAt,
Expand Down Expand Up @@ -174,7 +177,7 @@
async (
_accessToken: string,
_refreshToken: string,
profile: any,

Check warning on line 180 in packages/backend/src/services/oauth/oauth.service.ts

View workflow job for this annotation

GitHub Actions / 🔍 Validate Pull Request

Unexpected any. Specify a different type
done: (error: Error | null, user?: Express.User | false) => void
) => {
try {
Expand All @@ -197,6 +200,7 @@
email: userDoc.email,
displayName: userDoc.name,
avatar: userDoc.avatar,
verifiedAlias: userDoc.verifiedAlias,
providers: userDoc.providers,
role: userDoc.role,
createdAt: userDoc.createdAt,
Expand Down Expand Up @@ -244,6 +248,7 @@
email: userDoc.email,
displayName: userDoc.name,
avatar: userDoc.avatar,
verifiedAlias: userDoc.verifiedAlias,
providers: userDoc.providers,
role: userDoc.role,
createdAt: userDoc.createdAt,
Expand Down
40 changes: 26 additions & 14 deletions packages/backend/src/services/user/user.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
},

async findOrCreateUser(profile: ProviderProfile): Promise<UserDocument> {
const { provider, providerId, email, name, avatar } = profile;
const { provider, providerId, email, name, avatar, username } = profile;
const db = mongo.getDb();
const collection = db.collection('users');
const normalizedEmail = email.toLowerCase();
Expand All @@ -60,13 +60,18 @@

// If provider already linked and matches, just update last login
if (providerData && providerData.id === providerId) {
const updateFields: any = {

Check warning on line 63 in packages/backend/src/services/user/user.service.ts

View workflow job for this annotation

GitHub Actions / 🔍 Validate Pull Request

Unexpected any. Specify a different type
lastLoginAt: new Date(),
updatedAt: new Date(),
};
// Update verifiedAlias if username provided and not already set
if (username && !user.verifiedAlias) {
updateFields.verifiedAlias = username;
}
await collection.updateOne(
{ _id: user._id! },
{
$set: {
lastLoginAt: new Date(),
updatedAt: new Date(),
},
$set: updateFields,
}
);

Expand All @@ -77,24 +82,30 @@

return {
...user,
verifiedAlias: username && !user.verifiedAlias ? username : user.verifiedAlias,
lastLoginAt: new Date(),
updatedAt: new Date(),
};
}

// Auto-link new provider to existing email
const autoLinkUpdate: any = {

Check warning on line 92 in packages/backend/src/services/user/user.service.ts

View workflow job for this annotation

GitHub Actions / 🔍 Validate Pull Request

Unexpected any. Specify a different type
[`providers.${provider}`]: {
id: providerId,
email: normalizedEmail,
connectedAt: new Date(),
},
lastLoginAt: new Date(),
updatedAt: new Date(),
};
// Set verifiedAlias if username provided and not already set
if (username && !user.verifiedAlias) {
autoLinkUpdate.verifiedAlias = username;
}
await collection.updateOne(
{ _id: user._id! },
{
$set: {
[`providers.${provider}`]: {
id: providerId,
email: normalizedEmail,
connectedAt: new Date(),
},
lastLoginAt: new Date(),
updatedAt: new Date(),
},
$set: autoLinkUpdate,
}
);

Expand All @@ -114,6 +125,7 @@
email: normalizedEmail,
name: name || normalizedEmail.split('@')[0],
avatar,
verifiedAlias: username, // Store verified alias from OAuth provider
role: 'user',
isActive: true,
providers: {
Expand Down
1 change: 1 addition & 0 deletions packages/backend/src/types/express.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ declare global {
email: string;
displayName?: string;
avatar?: string;
verifiedAlias?: string; // Verified username/alias from OAuth provider

// Provider information
providers?: {
Expand Down
1 change: 1 addition & 0 deletions packages/frontend/src/lib/auth-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export interface User {
email: string;
name: string;
avatar?: string;
verifiedAlias?: string; // Verified username/alias from OAuth provider
role: 'user' | 'admin';
providers: string[];
createdAt?: string;
Expand Down
5 changes: 4 additions & 1 deletion packages/shared/src/types/user.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export interface UserDocument {
email: string;
name?: string;
avatar?: string;
verifiedAlias?: string; // Verified username/alias from OAuth provider (e.g., GitHub username)
role: 'user' | 'admin';
isActive: boolean;

Expand Down Expand Up @@ -73,6 +74,7 @@ export interface ProviderProfile {
email: string;
name?: string;
avatar?: string;
username?: string; // Provider-specific username/alias (e.g., GitHub username)
}

/**
Expand All @@ -83,6 +85,7 @@ export interface UserApiResponse {
email: string;
name?: string;
avatar?: string;
verifiedAlias?: string;
role: 'user' | 'admin';
providers: string[]; // Just provider names, not IDs
createdAt: string;
Expand Down Expand Up @@ -124,7 +127,7 @@ export interface UserUiResponse {
email: string;
name: string;
avatarUrl?: string;
githubUsername?: string;
verifiedAlias?: string;
role: 'user' | 'admin';
createdAt: string;
}
Expand Down