-
-
Notifications
You must be signed in to change notification settings - Fork 4
Release v1.0.12 #451
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Release v1.0.12 #451
Changes from all commits
6db1b0a
9e32b6b
c05655d
3c1764b
61722df
83c111a
ba6060d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -1,63 +1,10 @@ | ||||||||||||||||||||||||||||||||||
| # DevLovers | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| A full-stack interview preparation platform for frontend, backend, and full-stack developers. | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| **Production:** [devlovers.net](https://devlovers.net) | ||||||||||||||||||||||||||||||||||
| **Develop:** [develop.devlovers.net](https://develop-devlovers.netlify.app) | ||||||||||||||||||||||||||||||||||
| [](https://app.netlify.com/projects/develop-devlovers/deploys) | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ## Overview | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| DevLovers helps developers prepare for technical interviews through: | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| - **Q&A Section** — Categorized interview questions (JavaScript, React, Node.js, etc.) | ||||||||||||||||||||||||||||||||||
| - **Quiz System** — Timed quizzes with anti-cheat, progress tracking, and leaderboards | ||||||||||||||||||||||||||||||||||
| - **Leaderboard** — Gamification with improvement-based scoring | ||||||||||||||||||||||||||||||||||
| - **Blog** — Technical articles managed via Sanity CMS | ||||||||||||||||||||||||||||||||||
| - **Shop** — E-commerce with Stripe payments and inventory management | ||||||||||||||||||||||||||||||||||
| - **About** — Landing page with platform stats, features overview, and community info | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| Supports three languages: Ukrainian, English, Polish. | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ## Tech Stack | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| | Category | Technologies | | ||||||||||||||||||||||||||||||||||
| | ---------- | ----------------------------------- | | ||||||||||||||||||||||||||||||||||
| | Framework | Next.js 16, React 19, TypeScript | | ||||||||||||||||||||||||||||||||||
| | Styling | Tailwind CSS v4, Framer Motion | | ||||||||||||||||||||||||||||||||||
| | Database | PostgreSQL (Neon), Drizzle ORM | | ||||||||||||||||||||||||||||||||||
| | Caching | Upstash Redis | | ||||||||||||||||||||||||||||||||||
| | CMS | Sanity Studio, GROQ | | ||||||||||||||||||||||||||||||||||
| | UI | Radix UI, Lucide Icons | | ||||||||||||||||||||||||||||||||||
| | Auth | JWT (jsonwebtoken), bcryptjs, OAuth | | ||||||||||||||||||||||||||||||||||
| | Payments | Stripe | | ||||||||||||||||||||||||||||||||||
| | Email | Nodemailer | | ||||||||||||||||||||||||||||||||||
| | i18n | next-intl | | ||||||||||||||||||||||||||||||||||
| | AI | Groq SDK | | ||||||||||||||||||||||||||||||||||
| | Testing | Vitest, React Testing Library | | ||||||||||||||||||||||||||||||||||
| | Media | Cloudinary | | ||||||||||||||||||||||||||||||||||
| | Deployment | Vercel | | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ## Project Structure | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||
| devlovers.net/ | ||||||||||||||||||||||||||||||||||
| ├── frontend/ # Next.js application | ||||||||||||||||||||||||||||||||||
| │ ├── app/ | ||||||||||||||||||||||||||||||||||
| │ │ ├── [locale]/ # Localized pages (uk/en/pl) | ||||||||||||||||||||||||||||||||||
| │ │ └── api/ # API routes | ||||||||||||||||||||||||||||||||||
| │ ├── components/ # React components | ||||||||||||||||||||||||||||||||||
| │ ├── db/ | ||||||||||||||||||||||||||||||||||
| │ │ ├── schema/ # Drizzle table definitions | ||||||||||||||||||||||||||||||||||
| │ │ └── queries/ # Reusable DB queries | ||||||||||||||||||||||||||||||||||
| │ ├── hooks/ # Custom React hooks | ||||||||||||||||||||||||||||||||||
| │ ├── i18n/ # Internationalization config | ||||||||||||||||||||||||||||||||||
| │ ├── lib/ # Utilities and business logic | ||||||||||||||||||||||||||||||||||
| │ └── messages/ # Translation files (JSON) | ||||||||||||||||||||||||||||||||||
| │ | ||||||||||||||||||||||||||||||||||
| └── studio/ # Sanity CMS | ||||||||||||||||||||||||||||||||||
| └── schemaTypes/ # Content schemas (posts, authors) | ||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||
| # DevLovers Technical Interview Platform | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| > [!NOTE] | ||||||||||||||||||||||||||||||||||
| > | ||||||||||||||||||||||||||||||||||
| > ### Train smarter, interview stronger. | ||||||||||||||||||||||||||||||||||
| > | ||||||||||||||||||||||||||||||||||
| > DevLovers is a multi-language interview prep platform with curated Q&A, timed quizzes, leaderboard rankings, a developer blog, and a personal dashboard to track real learning progress. | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ## Main Features | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
|
|
@@ -103,7 +50,7 @@ devlovers.net/ | |||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ### Blog | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| - Technical articles via Sanity CMS | ||||||||||||||||||||||||||||||||||
| - Technical articles via custom in-house admin panel | ||||||||||||||||||||||||||||||||||
| - Category and tag filtering | ||||||||||||||||||||||||||||||||||
| - Search with pagination | ||||||||||||||||||||||||||||||||||
| - Multi-language content (uk/en/pl) | ||||||||||||||||||||||||||||||||||
|
|
@@ -126,33 +73,18 @@ devlovers.net/ | |||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
|  | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ## Getting Started | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ```bash | ||||||||||||||||||||||||||||||||||
| # Install dependencies | ||||||||||||||||||||||||||||||||||
| cd frontend && npm install | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| # Set up environment variables | ||||||||||||||||||||||||||||||||||
| cp .env.example .env.local | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| # Run development server | ||||||||||||||||||||||||||||||||||
| npm run dev | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| # Database commands | ||||||||||||||||||||||||||||||||||
| npx drizzle-kit generate # Generate migrations | ||||||||||||||||||||||||||||||||||
| npx drizzle-kit push # Apply migrations | ||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ## Git Workflow | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| - `main` — production branch | ||||||||||||||||||||||||||||||||||
| - `develop` — development branch | ||||||||||||||||||||||||||||||||||
| - Feature branches: `prefix/feat/feature-name` | ||||||||||||||||||||||||||||||||||
| ## Dashboard | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| Task tracking via [GitHub Projects](https://github.com/DevLoversTeam/devlovers.net/projects) board. | ||||||||||||||||||||||||||||||||||
| - Personal learning dashboard with progress insights | ||||||||||||||||||||||||||||||||||
| - Quiz history and performance overview | ||||||||||||||||||||||||||||||||||
| - Quick access to key account activity | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| ## License | ||||||||||||||||||||||||||||||||||
|  | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| **MIT** | ||||||||||||||||||||||||||||||||||
| > [!IMPORTANT] | ||||||||||||||||||||||||||||||||||
| > **Contact me:** [contact@devlovers.net](mailto:contact@devlovers.net) | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| **Contact me:** [contact@devlovers.net](mailto:contact@devlovers.net) | ||||||||||||||||||||||||||||||||||
| > [!TIP] | ||||||||||||||||||||||||||||||||||
| > **Production:** [devlovers.net](https://devlovers.net) | ||||||||||||||||||||||||||||||||||
| > | ||||||||||||||||||||||||||||||||||
| > **Develop:** [develop.devlovers.net](https://develop-devlovers.netlify.app) [](https://app.netlify.com/projects/develop-devlovers/deploys) | ||||||||||||||||||||||||||||||||||
|
Comment on lines
+84
to
+90
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Avoid adjacent blockquote lint failures. The back-to-back admonitions and blank quoted line can trigger markdownlint MD028. Add an HTML separator between callouts and remove the blank blockquote line inside the TIP. 📝 Proposed fix > [!IMPORTANT]
> **Contact me:** [contact@devlovers.net](mailto:contact@devlovers.net)
+<!-- -->
+
> [!TIP]
> **Production:** [devlovers.net](https://devlovers.net)
->
> **Develop:** [develop.devlovers.net](https://develop-devlovers.netlify.app) [](https://app.netlify.com/projects/develop-devlovers/deploys)📝 Committable suggestion
Suggested change
🧰 Tools🪛 LanguageTool[style] ~87-~87: Using many exclamation marks might seem excessive (in this case: 3 exclamation marks for a text that’s 1575 characters long) (EN_EXCESSIVE_EXCLAMATION) 🪛 markdownlint-cli2 (0.22.0)[warning] 86-86: Blank line inside blockquote (MD028, no-blanks-blockquote) 🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,14 +1,40 @@ | ||
| import { resolveStandardStorefrontProviderCapabilities } from '@/lib/shop/commercial-policy.server'; | ||
| import { isMonobankEnabled } from '@/lib/env/monobank'; | ||
| import { readServerEnv } from '@/lib/env/server-env'; | ||
| import { isPaymentsEnabled as isStripePaymentsEnabled } from '@/lib/env/stripe'; | ||
|
|
||
| function isFlagEnabled(value: string | undefined): boolean { | ||
| const normalized = (value ?? '').trim().toLowerCase(); | ||
| return ( | ||
| normalized === 'true' || | ||
| normalized === '1' || | ||
| normalized === 'yes' || | ||
| normalized === 'on' | ||
| ); | ||
| } | ||
|
|
||
| export function resolveStripeCheckoutEnabled(): boolean { | ||
| return resolveStandardStorefrontProviderCapabilities().stripeCheckoutEnabled; | ||
| try { | ||
| return isStripePaymentsEnabled({ | ||
| requirePublishableKey: true, | ||
| }); | ||
| } catch { | ||
| return false; | ||
| } | ||
| } | ||
|
|
||
| export function resolveMonobankCheckoutEnabled(): boolean { | ||
| return resolveStandardStorefrontProviderCapabilities().monobankCheckoutEnabled; | ||
| const paymentsEnabled = isFlagEnabled(readServerEnv('PAYMENTS_ENABLED')); | ||
| if (!paymentsEnabled) return false; | ||
|
|
||
| try { | ||
| return isMonobankEnabled(); | ||
| } catch { | ||
| return false; | ||
| } | ||
| } | ||
|
|
||
| export function resolveMonobankGooglePayEnabled(): boolean { | ||
| return resolveStandardStorefrontProviderCapabilities() | ||
| .monobankGooglePayEnabled; | ||
| if (!resolveMonobankCheckoutEnabled()) return false; | ||
|
|
||
| return isFlagEnabled(readServerEnv('SHOP_MONOBANK_GPAY_ENABLED')); | ||
| } | ||
|
Comment on lines
25
to
40
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Keep Monobank env reads inside the fail-closed boundary. Line 26 and Line 39 can still throw before returning 🛡️ Proposed fail-closed adjustment export function resolveMonobankCheckoutEnabled(): boolean {
- const paymentsEnabled = isFlagEnabled(readServerEnv('PAYMENTS_ENABLED'));
- if (!paymentsEnabled) return false;
-
try {
+ const paymentsEnabled = isFlagEnabled(readServerEnv('PAYMENTS_ENABLED'));
+ if (!paymentsEnabled) return false;
+
return isMonobankEnabled();
} catch {
return false;
}
}
export function resolveMonobankGooglePayEnabled(): boolean {
- if (!resolveMonobankCheckoutEnabled()) return false;
-
- return isFlagEnabled(readServerEnv('SHOP_MONOBANK_GPAY_ENABLED'));
+ try {
+ if (!resolveMonobankCheckoutEnabled()) return false;
+
+ return isFlagEnabled(readServerEnv('SHOP_MONOBANK_GPAY_ENABLED'));
+ } catch {
+ return false;
+ }
}🤖 Prompt for AI Agents |
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix the skipped heading level in the note.
###immediately after the H1 triggers markdownlint MD001. This can be bold text instead of a nested heading.📝 Proposed fix
📝 Committable suggestion
🧰 Tools
🪛 markdownlint-cli2 (0.22.0)
[warning] 5-5: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3
(MD001, heading-increment)
🤖 Prompt for AI Agents