mirror of
https://github.com/AustinKelsay/plebdevs.git
synced 2025-06-23 16:05:24 +00:00
Grabbing required github creds, populating contribution chart dynamically
This commit is contained in:
parent
c9d702576e
commit
1fc4925d88
@ -13,6 +13,7 @@ generator client {
|
|||||||
provider = "prisma-client-js"
|
provider = "prisma-client-js"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo name and username?
|
||||||
model User {
|
model User {
|
||||||
id String @id @default(uuid())
|
id String @id @default(uuid())
|
||||||
pubkey String? @unique
|
pubkey String? @unique
|
||||||
|
@ -23,6 +23,7 @@ import { classNames } from "primereact/utils";
|
|||||||
const UserProfile = () => {
|
const UserProfile = () => {
|
||||||
const windowWidth = useWindowWidth();
|
const windowWidth = useWindowWidth();
|
||||||
const [user, setUser] = useState(null);
|
const [user, setUser] = useState(null);
|
||||||
|
const [account, setAccount] = useState(null);
|
||||||
const { data: session } = useSession();
|
const { data: session } = useSession();
|
||||||
const { returnImageProxy } = useImageProxy();
|
const { returnImageProxy } = useImageProxy();
|
||||||
const { ndk, addSigner } = useNDKContext();
|
const { ndk, addSigner } = useNDKContext();
|
||||||
@ -37,7 +38,12 @@ const UserProfile = () => {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (session?.user) {
|
if (session?.user) {
|
||||||
|
console.log("Session", session)
|
||||||
setUser(session.user);
|
setUser(session.user);
|
||||||
|
|
||||||
|
if (session?.account) {
|
||||||
|
setAccount(session.account);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}, [session]);
|
}, [session]);
|
||||||
|
|
||||||
@ -129,8 +135,11 @@ const UserProfile = () => {
|
|||||||
<span className="font-bold">NIP-05:</span> {user.nip05.name}@plebdevs.com <i className="pi pi-copy cursor-pointer hover:text-gray-400" onClick={() => copyToClipboard(user.nip05.name + "@plebdevs.com")} />
|
<span className="font-bold">NIP-05:</span> {user.nip05.name}@plebdevs.com <i className="pi pi-copy cursor-pointer hover:text-gray-400" onClick={() => copyToClipboard(user.nip05.name + "@plebdevs.com")} />
|
||||||
</h3>
|
</h3>
|
||||||
)}
|
)}
|
||||||
{/* <GithubContributionChart username={"austinkelsay"} /> */}
|
{account && account?.provider === "github" ? (
|
||||||
<GithubContributionChartDisabled username={"austinkelsay"} />
|
<GithubContributionChart username={user.username} />
|
||||||
|
) : (
|
||||||
|
<GithubContributionChartDisabled username={"austinkelsay"} />
|
||||||
|
)}
|
||||||
<UserProgress />
|
<UserProgress />
|
||||||
</div>
|
</div>
|
||||||
{!session || !session?.user || !ndk ? (
|
{!session || !session?.user || !ndk ? (
|
||||||
|
@ -11,11 +11,16 @@ import { updateUser, getUserByPubkey, createUser } from "@/db/models/userModels"
|
|||||||
import { createRole } from "@/db/models/roleModels";
|
import { createRole } from "@/db/models/roleModels";
|
||||||
import appConfig from "@/config/appConfig";
|
import appConfig from "@/config/appConfig";
|
||||||
import GithubProvider from "next-auth/providers/github";
|
import GithubProvider from "next-auth/providers/github";
|
||||||
|
import NDK from "@nostr-dev-kit/ndk";
|
||||||
import { SimplePool } from "nostr-tools";
|
import { SimplePool } from "nostr-tools";
|
||||||
import { finalizeEvent } from "nostr-tools";
|
import { finalizeEvent } from "nostr-tools";
|
||||||
|
|
||||||
// todo: currently email accounts ephemeral privkey gets saved to db but not anon user, is this required at all given the newer auth setup?
|
// todo: currently email accounts ephemeral privkey gets saved to db but not anon user, is this required at all given the newer auth setup?
|
||||||
|
|
||||||
|
const ndk = new NDK({
|
||||||
|
explicitRelayUrls: appConfig.defaultRelayUrls
|
||||||
|
})
|
||||||
|
|
||||||
const authorize = async (pubkey) => {
|
const authorize = async (pubkey) => {
|
||||||
await ndk.connect();
|
await ndk.connect();
|
||||||
const user = ndk.getUser({ pubkey });
|
const user = ndk.getUser({ pubkey });
|
||||||
@ -125,7 +130,17 @@ export const authOptions = {
|
|||||||
}),
|
}),
|
||||||
GithubProvider({
|
GithubProvider({
|
||||||
clientId: process.env.GITHUB_CLIENT_ID,
|
clientId: process.env.GITHUB_CLIENT_ID,
|
||||||
clientSecret: process.env.GITHUB_CLIENT_SECRET
|
clientSecret: process.env.GITHUB_CLIENT_SECRET,
|
||||||
|
profile: async (profile) => {
|
||||||
|
console.log("GitHub Profile Data:", profile);
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: profile.id.toString(),
|
||||||
|
name: profile.login, // Using login instead of name
|
||||||
|
email: profile.email,
|
||||||
|
avatar: profile.avatar_url
|
||||||
|
}
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
CredentialsProvider({
|
CredentialsProvider({
|
||||||
id: "anonymous",
|
id: "anonymous",
|
||||||
@ -166,6 +181,11 @@ export const authOptions = {
|
|||||||
],
|
],
|
||||||
callbacks: {
|
callbacks: {
|
||||||
async jwt({ token, user, account, trigger }) {
|
async jwt({ token, user, account, trigger }) {
|
||||||
|
// Add account to token if it exists
|
||||||
|
if (account) {
|
||||||
|
token.account = account;
|
||||||
|
}
|
||||||
|
|
||||||
if (trigger === "update" && account?.provider !== "anonymous") {
|
if (trigger === "update" && account?.provider !== "anonymous") {
|
||||||
// if we trigger an update call the authorize function again
|
// if we trigger an update call the authorize function again
|
||||||
const newUser = await authorize(token.user.pubkey);
|
const newUser = await authorize(token.user.pubkey);
|
||||||
@ -174,6 +194,8 @@ export const authOptions = {
|
|||||||
|
|
||||||
// if we sign up with email and we don't have a pubkey or privkey, we need to generate them
|
// if we sign up with email and we don't have a pubkey or privkey, we need to generate them
|
||||||
if (trigger === "signUp" && account?.provider === "email" && !user.pubkey && !user.privkey) {
|
if (trigger === "signUp" && account?.provider === "email" && !user.pubkey && !user.privkey) {
|
||||||
|
console.log("signUp", user);
|
||||||
|
console.log("account", account);
|
||||||
const sk = generateSecretKey();
|
const sk = generateSecretKey();
|
||||||
const pubkey = getPublicKey(sk);
|
const pubkey = getPublicKey(sk);
|
||||||
const privkey = bytesToHex(sk);
|
const privkey = bytesToHex(sk);
|
||||||
@ -195,40 +217,28 @@ export const authOptions = {
|
|||||||
const pubkey = getPublicKey(sk);
|
const pubkey = getPublicKey(sk);
|
||||||
const privkey = bytesToHex(sk);
|
const privkey = bytesToHex(sk);
|
||||||
|
|
||||||
// Update the user in the database
|
// Prioritize login as the username and name
|
||||||
|
const githubUsername = token?.login || token.name; // GitHub login is the @username
|
||||||
|
|
||||||
|
// Update the user in the database with all GitHub details
|
||||||
await prisma.user.update({
|
await prisma.user.update({
|
||||||
where: { id: user.id },
|
where: { id: user.id },
|
||||||
data: { pubkey, privkey, name: user.name, username: user.name, avatar: user.image || null }
|
data: {
|
||||||
|
pubkey,
|
||||||
|
privkey,
|
||||||
|
name: githubUsername,
|
||||||
|
username: githubUsername,
|
||||||
|
avatar: user.image || null,
|
||||||
|
email: user.email,
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Publish kind0 event to nostr
|
// Update the user object with all credentials
|
||||||
try {
|
|
||||||
const pool = new SimplePool();
|
|
||||||
const relays = [
|
|
||||||
"wss://relay.damus.io",
|
|
||||||
"wss://relay.nostr.band",
|
|
||||||
"wss://relay.primal.net",
|
|
||||||
"wss://relay.devs.tools"
|
|
||||||
];
|
|
||||||
|
|
||||||
const event = finalizeEvent({
|
|
||||||
kind: 0,
|
|
||||||
created_at: Math.floor(Date.now() / 1000),
|
|
||||||
tags: [],
|
|
||||||
content: JSON.stringify({
|
|
||||||
name: user.name,
|
|
||||||
picture: user.image
|
|
||||||
})
|
|
||||||
}, privkey);
|
|
||||||
|
|
||||||
await Promise.any(pool.publish(relays, event));
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Failed to publish kind0 event:', error);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update user object with nostr keys
|
|
||||||
user.pubkey = pubkey;
|
user.pubkey = pubkey;
|
||||||
user.privkey = privkey;
|
user.privkey = privkey;
|
||||||
|
user.name = githubUsername;
|
||||||
|
user.username = githubUsername;
|
||||||
|
user.githubUsername = token?.login || null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user) {
|
if (user) {
|
||||||
@ -245,6 +255,10 @@ export const authOptions = {
|
|||||||
},
|
},
|
||||||
async session({ session, token }) {
|
async session({ session, token }) {
|
||||||
session.user = token.user;
|
session.user = token.user;
|
||||||
|
// Add account from token to session
|
||||||
|
if (token.account) {
|
||||||
|
session.account = token.account;
|
||||||
|
}
|
||||||
if (token.pubkey && token.privkey) {
|
if (token.pubkey && token.privkey) {
|
||||||
session.pubkey = token.pubkey;
|
session.pubkey = token.pubkey;
|
||||||
session.privkey = token.privkey;
|
session.privkey = token.privkey;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user