← back to kyle94024__Science-Simplified

Function bodies 169 total

All specs Real LLM only Function bodies
useAuth function · javascript · L6-L92 (87 LOC)
src/hooks/useAuth.js
export function useAuth() {
    const router = useRouter();
    const { setUser, clearUser } = useAuthStore();
    const [loading, setLoading] = useState(true);
    const [error, setError] = useState(null);

    useEffect(() => {
        const checkAuth = async () => {
            setLoading(true); // Start loading at the beginning of the function
            try {
                const response = await fetch("/api/auth/session");
                if (response.ok) {
                    const user = await response.json();
                    if (user.isLoggedIn) {
                        setUser({
                            email: user.email,
                            userId: user.userId,
                            name: user.name,
                            isAdmin: user.isAdmin,
                            role: user.role,
                        }); // Pass complete user data
                    } else {
                        clearUser();
                    }
                }
requireAdmin function · javascript · L6-L27 (22 LOC)
src/lib/adminGuard.js
export function requireAdmin(req) {
  const token = req.cookies.get("auth")?.value;
  if (!token) {
    return NextResponse.json({ message: "Not authenticated" }, { status: 401 });
  }

  let payload;
  try {
    payload = verify(token, process.env.JWT_SECRET || "your-secret-key");
  } catch {
    return NextResponse.json({ message: "Invalid token" }, { status: 401 });
  }

  console.log("Decoded JWT payload:", payload);


  if (!payload.isAdmin && payload.role !== "editor") {
    return NextResponse.json({ message: "Forbidden" }, { status: 403 });
  }

  return payload;
}
createAuthCookie function · javascript · L4-L23 (20 LOC)
src/lib/auth.js
export function createAuthCookie(user) {
    const token = sign(
        {
            email: user.email,
            id: user.id,
            role: user.role,
            name: `${user.first_name} ${user.last_name}`,
        },
        process.env.JWT_SECRET,
        { expiresIn: "1d" }
    );

    return serialize("auth", token, {
        httpOnly: true,
        secure: process.env.NODE_ENV === "production",
        sameSite: "strict",
        maxAge: 86400,
        path: "/",
    });
}
query function · javascript · L12-L23 (12 LOC)
src/lib/db.js
export async function query(text, params) {
    try {
        const start = Date.now();
        const res = await pool.query(text, params);
        const duration = Date.now() - start;
        console.log("Executed query", { text, duration, rows: res.rowCount });
        return res;
    } catch (error) {
        console.error("Error executing query", error);
        throw error;
    }
}
sendMagicLinkEmail function · javascript · L3-L30 (28 LOC)
src/lib/email.js
export async function sendMagicLinkEmail({ tenant, email, url }) {
    const magicUrl = url; // EXACT URL passed from create route

    const transporter = nodemailer.createTransport({
        host: "smtp.gmail.com",
        port: 587,
        secure: false,
        auth: {
            user: process.env.EMAIL_USER,
            pass: process.env.EMAIL_PASS,
        },
    });

    await transporter.sendMail({
        from: `"Simplified Login" <${process.env.EMAIL_USER}>`,
        to: email,
        subject: "Your Magic Login Link",
        html: `
            <p>Click to sign in:</p>
            <a href="${magicUrl}" style="color: #4cb19f; font-size: 18px;">
                Login to your account
            </a>
            <p>This link expires in 30 days.</p>
        `,
    });

    return true;
}
getArticleIdFromHsfId function · javascript · L72-L74 (3 LOC)
src/lib/hsfRedirects.js
export function getArticleIdFromHsfId(hsfId) {
  return hsfIdToArticleId[hsfId] || null;
}
storeMagicLink function · javascript · L4-L12 (9 LOC)
src/lib/magicLinks.js
export async function storeMagicLink({ tenant, email, tokenHash, redirectUrl }) {
    const pool = getTenantPool(tenant);

    await pool.query(
        `INSERT INTO magic_links (email, token_hash, redirect_url)
         VALUES ($1, $2, $3)`,
        [email, tokenHash, redirectUrl]
    );
}
Repobility — same analyzer, your code, free for public repos · /scan/
getMagicLinkRecord function · javascript · L15-L25 (11 LOC)
src/lib/magicLinks.js
export async function getMagicLinkRecord(tenant, tokenHash) {
    const pool = getTenantPool(tenant);

    const result = await pool.query(
        `SELECT * FROM magic_links 
         WHERE token_hash = $1 AND used = FALSE`,
        [tokenHash]
    );

    return result.rows[0] || null;
}
markTokenUsed function · javascript · L28-L35 (8 LOC)
src/lib/magicLinks.js
export async function markTokenUsed(tenant, tokenHash) {
    const pool = getTenantPool(tenant);

    await pool.query(
        `UPDATE magic_links SET used = TRUE WHERE token_hash = $1`,
        [tokenHash]
    );
}
getTenantPool function · javascript · L6-L38 (33 LOC)
src/lib/tenantDb.js
export function getTenantPool(tenant) {
  if (pools[tenant]) {
    return pools[tenant];
  }

  // // Load tenant-specific env file
  // dotenv.config({
  //   path: path.join(process.cwd(), `.env.${tenant}`),
  //   override: true, // <--- THIS IS WHAT MAKES ENV SWITCH
  // });

  // console.log(`🔄 Loaded env for tenant: ${tenant}`);
  console.log("→ Using DB:", {
    host: process.env.PGHOST,
    user: process.env.PGUSER,
    db: process.env.PGDATABASE,
  });

  const pool = new Pool({
    user: process.env.PGUSER,
    host: process.env.PGHOST,
    database: process.env.PGDATABASE,
    password: process.env.PGPASSWORD,
    port: parseInt(process.env.PGPORT || "5432"),
    ssl: {
      rejectUnauthorized: false,
      require: true,
    },
  });

  pools[tenant] = pool;
  return pool;
}
tenantQuery function · javascript · L40-L43 (4 LOC)
src/lib/tenantDb.js
export async function tenantQuery(tenant, text, params) {
  const pool = getTenantPool(tenant);
  return pool.query(text, params);
}
findUserByEmail function · javascript · L3-L10 (8 LOC)
src/lib/users.js
export async function findUserByEmail(tenant, email) {
    const res = await tenantQuery(
        tenant,
        "SELECT * FROM users WHERE email = $1",
        [email]
    );
    return res.rows[0] || null;
}
createUserIfNotExists function · javascript · L12-L25 (14 LOC)
src/lib/users.js
export async function createUserIfNotExists(tenant, email) {
    let user = await findUserByEmail(tenant, email);

    if (!user) {
        const insert = await tenantQuery(
            tenant,
            "INSERT INTO users (email, role, first_name, last_name) VALUES ($1, 'user', '', '') RETURNING *",
            [email]
        );
        user = insert.rows[0];
    }

    return user;
}
cn function · javascript · L4-L6 (3 LOC)
src/lib/utils.js
export function cn(...inputs) {
  return twMerge(clsx(inputs));
}
cleanName function · javascript · L9-L11 (3 LOC)
src/lib/utils.js
export function cleanName(name) {
  return name.trim().replace(/\s*\d+$/, "");
}
Want fix-PRs on findings? Install Repobility's GitHub App · github.com/apps/repobility-bot
summarizeArticle function · javascript · L26-L45 (20 LOC)
src/utils/apiHelpers.js
export async function summarizeArticle(content) {
    try {
        const response = await openai.chat.completions.create({
            model: "gpt-4.1-nano", // Fastest OpenAI model for simple summarization
            messages: [
                {
                    role: "system",
                    content:
                        "Can you write this as 2-3 sentence teaser summary for a Scientific American article for a lay person. Please define key medical terms. Specify the year the article was written. Maximum of 280 characters",
                },
                { role: "user", content },
            ],
        });

        return response.choices[0].message.content.trim();
    } catch (error) {
        console.error("Error summarizing article:", error);
        throw error;
    }
}
simplifyArticle function · javascript · L47-L132 (86 LOC)
src/utils/apiHelpers.js
export async function simplifyArticle(content, lengthString) {
    try {
        // NF-specific addendum for updated nomenclature
        const nfAddendum = tenant.shortName === "NF" ? `
IMPORTANT - NF NOMENCLATURE:
When discussing types of neurofibromatosis, use the current diagnostic terminology:
• "NF2" should be referred to as "NF2-related schwannomatosis" (NF2-SWN)
• The umbrella term "schwannomatosis" now includes NF2-related schwannomatosis and SMARCB1/LZTR1-related schwannomatosis
• When referring to all forms collectively, use "all forms of neurofibromatosis and schwannomatosis"
• If the source article uses older terminology (just "NF2"), you may update it to the current nomenclature while preserving the original meaning
` : "";

        const instruction = `
You simplify scientific articles into a patient-friendly science summary for readers who already have basic familiarity with the condition being discussed. Assume an informed patient or caregiver audience. Do NOT explain 
markdownToHtml function · javascript · L135-L137 (3 LOC)
src/utils/apiHelpers.js
function markdownToHtml(markdown) {
    return marked(markdown);
}
testPMC function · javascript · L13-L53 (41 LOC)
test-pubmed.js
async function testPMC(pmcId) {
    const url = `https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pmc&id=${pmcId}&retmode=xml`;
    console.log(`Fetching: ${url}\n`);

    const response = await fetch(url);
    const xml = await response.text();
    const parsed = await xml2js.parseStringPromise(xml, { explicitArray: false });

    const article = parsed?.["pmc-articleset"]?.article;
    const meta = article?.front?.["article-meta"];

    // Debug: print contrib-group structure
    console.log("=== contrib-group structure ===");
    console.log(JSON.stringify(meta?.["contrib-group"], null, 2));

    console.log("\n=== Extracting authors ===");

    // Current extraction logic
    const contribs = meta?.["contrib-group"]?.contrib;
    let authors = [];

    if (contribs) {
        const contribArray = Array.isArray(contribs) ? contribs : [contribs];
        console.log(`Found ${contribArray.length} contrib entries`);

        authors = contribArray.map((c, i) => {
          
‹ prevpage 4 / 4