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
15 changes: 15 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 2
trim_trailing_whitespace = true

[*.cs]
indent_size = 4

[*.md]
trim_trailing_whitespace = false
8 changes: 7 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Example environment for ProCoderJii Notes. Copy to .env.local for local development.
# Nothing here is secret: both values are public. Never put passwords or API keys in this file.
# Active example values are public. Never put passwords or private keys in this file.
# For production, set these in your hosting provider's environment settings (see docs/deployment.md).

# Public id of the @Pro_coder_ji YouTube channel. Enables the "Latest videos" section on the
Expand All @@ -9,3 +9,9 @@ YOUTUBE_CHANNEL_ID=UC74q2pzSGuoaikYwnavcGMg
# Canonical site origin. Optional: it defaults to https://procoderji.com, so only set it to override
# (for example on a staging build). It is compiled in at build time.
# NEXT_PUBLIC_SITE_URL=https://procoderji.com

# Optional ASP.NET Core backend. This URL is server-only; it is never sent to the browser.
# Leave unset for free guest practice with browser-local progress.
# Google client secrets belong in .NET user-secrets or the backend host's secret configuration.
# See backend/README.md for Google OAuth, database setup, and deployment.
# DOTNET_API_URL=http://localhost:5100
59 changes: 59 additions & 0 deletions .github/ISSUE_TEMPLATE/practice_question.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: Practice question proposal
description: Propose an original, explained exercise for student placement practice.
title: "practice: "
labels: [enhancement]
body:
- type: markdown
attributes:
value: |
Check existing questions and issues first. A useful proposal includes a correct answer,
an explanation, and clear authorship or permission. Do not paste a private assessment
or copyrighted question bank without permission.
- type: input
id: topic
attributes:
label: Topic and skill
description: Which topic and specific skill does this question help a student practise?
placeholder: "Percentages: successive percentage changes"
validations:
required: true
- type: textarea
id: audience
attributes:
label: Student audience and difficulty
description: Describe the intended learner, prerequisites, and difficulty.
placeholder: "Students starting campus-placement aptitude practice; basic percentage knowledge."
validations:
required: true
- type: textarea
id: question
attributes:
label: Question and options
description: Include the full question and answer options, if applicable. State units and assumptions clearly.
validations:
required: true
- type: textarea
id: answer
attributes:
label: Correct answer and explanation
description: Show the reasoning, calculation, or code. Explain why the answer is correct and any common mistake.
validations:
required: true
- type: textarea
id: source
attributes:
label: Authorship, sources, and permission
description: State whether you wrote the question. Link any source and explain the permission or licence for adapting it.
validations:
required: true
- type: checkboxes
id: review
attributes:
label: Submission checks
options:
- label: I wrote this material or have permission under the stated licence to submit it.
required: true
- label: I checked the answer and included an explanation.
required: true
- label: This proposal contains no private student data, credentials, or confidential assessment material.
required: true
86 changes: 86 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,89 @@ jobs:

- name: Production build
run: npm run build

site-quality:
name: Browser and SEO checks
runs-on: ubuntu-24.04
timeout-minutes: 30
steps:
- name: Check out repository
uses: actions/checkout@v7

- name: Set up Node.js
uses: actions/setup-node@v7
with:
node-version: 24
cache: npm

- name: Set up .NET for browser checks
uses: actions/setup-dotnet@v6
with:
dotnet-version: 10.0.x

- name: Install dependencies
run: npm ci

- name: Check desktop and mobile browser behavior
env:
E2E_DOTNET: '1'
run: npm run e2e

- name: Crawl production build and verify SEO
run: npm run launch-check

- name: Upload browser failure screenshots
if: failure()
uses: actions/upload-artifact@v7
with:
name: browser-screenshots-${{ github.run_attempt }}
path: e2e/.out/*.png
include-hidden-files: true
if-no-files-found: ignore
retention-days: 7

backend:
name: Backend build and tests
runs-on: ubuntu-24.04
timeout-minutes: 15
services:
postgres:
image: postgres:17-alpine
env:
# Fixed credentials are only for this disposable CI database.
POSTGRES_DB: procoderji_test
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U postgres -d procoderji_test"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- name: Check out repository
uses: actions/checkout@v7

- name: Set up .NET
uses: actions/setup-dotnet@v6
with:
dotnet-version: 10.0.x

- name: Restore backend dependencies
run: dotnet restore backend/ProCoderJi.slnx --locked-mode

- name: Build backend
run: dotnet build backend/ProCoderJi.slnx --configuration Release --no-restore

- name: Test backend
run: dotnet test backend/ProCoderJi.slnx --configuration Release --no-build

- name: Verify PostgreSQL migrations
# Validates the PostgreSQL schema path; Google sign-in needs separate live checks.
env:
ASPNETCORE_ENVIRONMENT: Development
Database__Provider: Postgres
ConnectionStrings__Platform: 'Host=localhost;Port=5432;Database=procoderji_test;Username=postgres;Password=postgres'
PublicOrigin: http://localhost:3000
run: dotnet run --project backend/src/ProCoderJi.Api --configuration Release --no-build --no-launch-profile -- --migrate
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,15 @@ __pycache__/
*.swp
Thumbs.db
desktop.ini

# ASP.NET Core output, local databases, and test evidence
**/bin/
**/obj/
**/TestResults/
backend/**/.data/
backend/**/*.db
backend/**/*.db-shm
backend/**/*.db-wal
backend/**/appsettings.Local.json
*.user
*.suo
1 change: 1 addition & 0 deletions .node-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
24
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
24
87 changes: 58 additions & 29 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -1,50 +1,79 @@
# Contributor Covenant Code of Conduct
# Code of Conduct

## Our pledge

We are committed to making participation in this project a respectful experience for everyone,
We want students, first-time contributors, and experienced maintainers to participate in a
welcoming, respectful community. We are committed to participation free from harassment,
regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics,
gender identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive,
and healthy community.
## Expected behavior

## Our standards
- Be patient with questions and explain feedback clearly. Someone may be learning Git, English,
a programming concept, or open-source collaboration for the first time.
- Review the contribution and its impact on students. Critique ideas and code respectfully.
- Give credit, respect copyright, and avoid publishing another person's private information.
- Accept constructive feedback, take responsibility for mistakes, and help resolve their impact.
- Respect a request to stop an interaction or move a discussion to an appropriate channel.

Examples of behavior that contributes to a positive environment include:
Unacceptable behavior includes harassment, threats, stalking, deliberate intimidation,
discriminatory or derogatory remarks, sexualized language or imagery, unwelcome sexual
attention, personal attacks, and publishing private information without permission. Repeated
disruption of discussions or retaliation against someone who raises a concern is also
unacceptable.

- Showing empathy and kindness toward other people.
- Giving and accepting constructive feedback respectfully.
- Taking responsibility, apologizing to those affected, and learning from mistakes.
- Focusing on what is best for the community.
## Where this applies

Examples of unacceptable behavior include:
This Code applies to the project's issues, discussions, pull requests, reviews, learning-content
submissions, and other project-managed spaces. It also applies when someone officially
represents ProCoderJii, for example through an official project account or an appointed role.

- Sexualized language or imagery, and unwelcome sexual attention.
- Trolling, insulting or derogatory comments, and personal or political attacks.
- Public or private harassment, including deliberate intimidation or stalking.
- Publishing another person's private information without permission.
- Other conduct that would reasonably be considered inappropriate in a professional setting.
## Report a concern

## Enforcement responsibilities
Email **procoderji@gmail.com**. Project maintainers use this channel to receive conduct reports.
Please include the information you are comfortable sharing:

Project maintainers are responsible for clarifying and enforcing these standards and may remove,
edit or reject comments, commits, code, issue reports and other contributions that do not align
with this Code. Maintainers may temporarily or permanently restrict participation for behavior
they consider inappropriate, threatening, offensive or harmful.
- What happened and where it happened.
- Links, dates, or screenshots that help explain the incident.
- People involved and whether the behavior is ongoing.
- A way to contact you and any concern about how a response could affect you.

## Scope
You do not need to investigate the incident yourself. Leave out unrelated personal information,
passwords, and private student records. Conduct reports should go through the email channel
rather than a public issue or pull-request discussion.

This Code applies within project spaces and when someone is officially representing the project
in public spaces.
Reports will be handled as privately as practical. Maintainers may need to share relevant
information with people who help review or resolve the incident; identifying details should be
limited to what is needed. Absolute confidentiality or anonymity cannot be guaranteed,
especially when an incident is already public. Reporters should be told about necessary
sharing when practical.

## Reporting
## Review and response

Report unacceptable behavior to **procoderji@gmail.com**. Reports will be reviewed and handled
confidentially. Maintainers will communicate the response to the reporter when appropriate.
Maintainers review available information, consider the behavior and its impact, and may ask for
clarification. A maintainer who is involved in a report should not decide its outcome. If another
reviewer is unavailable, that limitation should be made clear to the reporter.

The response should be proportionate to the severity, context, and recurrence of the behavior.
It may include:

1. **Correction:** explain the concern, request a change, or remove inappropriate content.
2. **Warning:** state the behavior that must stop and any conditions for continued participation.
3. **Temporary restriction:** limit participation in project spaces for a stated period.
4. **Permanent restriction:** end participation when serious or repeated harm makes it necessary.

These are available responses, not a required sequence. Serious behavior may need an immediate
restriction. Maintainers may remove or reject comments, content, or contributions that violate
this Code. They should communicate a decision and relevant participation conditions to those
affected when appropriate, while limiting disclosure of private report details.

Retaliation against a reporter, witness, or person helping resolve a report is a separate conduct
concern. If you believe a decision overlooked relevant information, request a review through
**procoderji@gmail.com** and explain the concern or new information.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org),
version 2.1, available at <https://www.contributor-covenant.org/version/2/1/code_of_conduct.html>.
This Code is adapted from the [Contributor Covenant](https://www.contributor-covenant.org),
version 2.1, available at
<https://www.contributor-covenant.org/version/2/1/code_of_conduct.html>.
Loading