Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
bde47f8
chore: initialize repository with gitignore and README skeleton
vinicastrolima Aug 7, 2026
4260b78
chore(api): scaffold Laravel 13 application
vinicastrolima Aug 7, 2026
6c21748
chore(web): scaffold Vue 3 + Vite + TypeScript SPA
vinicastrolima Aug 7, 2026
21af3fa
chore(docker): add Compose stack, Dockerfiles, nginx, Makefile and en…
vinicastrolima Aug 7, 2026
656c773
chore(api): install Sanctum and domain/dev dependencies
vinicastrolima Aug 7, 2026
d6ba4b6
chore(api): configure CORS, domain rules, code style and static analysis
vinicastrolima Aug 7, 2026
ca922a4
feat(domain): investment gain and tax calculation (TDD)
vinicastrolima Aug 7, 2026
547331c
chore(api): drop unused spatie/laravel-data and buggy laravel/pao
vinicastrolima Aug 7, 2026
2ba3258
feat(api): investments persistence layer
vinicastrolima Aug 7, 2026
22c2abc
feat(api): REST endpoints for investments and auth
vinicastrolima Aug 7, 2026
911ed3d
feat(mail): queued Blade notification e-mails (Mailpit)
vinicastrolima Aug 7, 2026
f2fd392
feat(seed): demo data across all tax brackets
vinicastrolima Aug 7, 2026
1595066
docs(api): OpenAPI docs via Scramble + exported spec
vinicastrolima Aug 7, 2026
22deb05
chore(web): configure Tailwind, aliases, ESLint, Prettier and Vitest
vinicastrolima Aug 8, 2026
a81a577
feat(web): app shell, routing, auth and typed API client
vinicastrolima Aug 8, 2026
8f75275
feat(web): investment list, detail, create and withdrawal
vinicastrolima Aug 8, 2026
baa1c69
test(web): unit tests for currency and date composables
vinicastrolima Aug 8, 2026
6764b6e
fix(docker): auto-restart the queue worker on first run
vinicastrolima Aug 8, 2026
d850557
chore(web): set the SPA page title
vinicastrolima Aug 8, 2026
dcd1e76
docs: add application screenshots
vinicastrolima Aug 8, 2026
d5fc4ac
docs: comprehensive README and MIT license
vinicastrolima Aug 8, 2026
4fe8545
chore(web): gitignore local .env
vinicastrolima Aug 8, 2026
b2fa784
chore: ignore local workspace files
vinicastrolima Aug 8, 2026
f0587ee
refactor(web): apply the supplied design system
vinicastrolima Aug 8, 2026
b58786d
feat(web): align investment flows with Figma
vinicastrolima Aug 8, 2026
1756bf6
docs: refresh delivery documentation and screenshots
vinicastrolima Aug 8, 2026
caf30a6
fix(seed): keep demo login available
vinicastrolima Aug 8, 2026
7cb23d5
fix(nginx): resolve php-fpm dynamically
vinicastrolima Aug 8, 2026
7f1e2c6
fix(test): isolate development database
vinicastrolima Aug 8, 2026
c27047d
feat(auth): add password visibility toggle
vinicastrolima Aug 8, 2026
ff36f85
fix(mail): prevent duplicate notifications
vinicastrolima Aug 8, 2026
02c94f2
fix(web): show owner and settled balance
vinicastrolima Aug 8, 2026
2919116
test(e2e): cover investment user journeys
vinicastrolima Aug 8, 2026
32db6a3
docs: document Playwright end-to-end tests
vinicastrolima Aug 8, 2026
ef23867
docs: add Composer installation troubleshooting
vinicastrolima Aug 8, 2026
685f9dd
fix(e2e): run Playwright without host npm
vinicastrolima Aug 8, 2026
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
18 changes: 18 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Root env — ONLY values that docker-compose interpolates (ports + DB creds).
# The API and SPA keep their own env files (api/.env, web/.env).
# Copy to .env: cp .env.example .env (handled automatically by `make up`)

COMPOSE_PROJECT_NAME=coderockr

# Postgres (shared by the `postgres` service and injected into the API container)
DB_DATABASE=investments
DB_USERNAME=investments
DB_PASSWORD=secret
DB_PORT=5432

# Host ports
API_HTTP_PORT=8080
WEB_HTTP_PORT=5173

# API base URL the SPA container is built/served with
VITE_API_URL=http://localhost:8080/api
20 changes: 20 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Root-level ignores (each app also has its own .gitignore)

# OS / editor
.DS_Store
Thumbs.db
*.swp
.idea/
.vscode/
/.claude/
*.log

# Root env used by docker-compose interpolation
/.env

# Local docker volumes / dumps
/data/
*.sql.gz

# Local planning notes
/plan.md
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Vinicius Castro

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
97 changes: 97 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@

# ============================================================================
# Investment Manager — developer entrypoints
# `make up` builds, starts, migrates and seeds the whole stack in one command.
# ============================================================================

DC := docker compose
APP := $(DC) exec -T app
WEB := $(DC) exec -T web

.DEFAULT_GOAL := help
.PHONY: help up down destroy build install migrate seed fresh key test e2e lint fix docs logs shell psql wait-db env

help: ## Show this help
@grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-10s\033[0m %s\n", $$1, $$2}'

env: ## Create .env files from examples if missing
@[ -f .env ] || cp .env.example .env
@[ -f api/.env ] || cp api/.env.example api/.env
@[ -f web/.env ] || cp web/.env.example web/.env
@echo "env files ready"

up: env ## Build + start everything, then migrate & seed (first-run friendly)
$(DC) up -d --build
$(MAKE) wait-db
$(APP) composer install
$(APP) php artisan key:generate --force
$(APP) php artisan migrate --seed --force
@echo ""
@echo " API -> http://localhost:$${API_HTTP_PORT:-8080}"
@echo " Docs -> http://localhost:$${API_HTTP_PORT:-8080}/docs/api"
@echo " SPA -> http://localhost:$${WEB_HTTP_PORT:-5173}"
@echo " Mail -> http://localhost:8025"

down: ## Stop and remove containers
$(DC) down

destroy: ## Stop and remove containers + volumes (DB wiped)
$(DC) down -v

build: ## Rebuild images
$(DC) build

install: ## Install PHP + JS dependencies
$(APP) composer install
$(WEB) npm ci

migrate: ## Run database migrations
$(APP) php artisan migrate

seed: ## Seed the database
$(APP) php artisan db:seed

fresh: ## Drop, re-migrate and re-seed the database
$(APP) php artisan migrate:fresh --seed

key: ## Generate the Laravel app key
$(APP) php artisan key:generate --force

test: ## Run backend + frontend test suites
$(APP) php artisan test
$(WEB) npm run test -- --run

e2e: ## Run the critical user journeys in Chromium
@status=0; \
$(DC) --profile e2e run --rm e2e || status=$$?; \
$(DC) --profile e2e rm -sf e2e-api-proxy >/dev/null; \
exit $$status

lint: ## Style + static analysis + type-check
$(APP) ./vendor/bin/pint --test
$(APP) ./vendor/bin/phpstan analyse --memory-limit=1G
$(WEB) npm run lint
$(WEB) npm run type-check

fix: ## Auto-fix code style
$(APP) ./vendor/bin/pint
$(WEB) npm run lint -- --fix

docs: ## Export the OpenAPI spec to docs/openapi.json
$(APP) php artisan scramble:export --path=docs/openapi.json

logs: ## Tail all container logs
$(DC) logs -f

shell: ## Open a shell in the API container
$(DC) exec app sh

psql: ## Open a psql session
$(DC) exec postgres psql -U $${DB_USERNAME:-investments} -d $${DB_DATABASE:-investments}

wait-db: ## Block until Postgres is accepting connections
@until $(DC) exec -T postgres pg_isready -U $${DB_USERNAME:-investments} >/dev/null 2>&1; do \
echo "waiting for postgres..."; sleep 1; \
done
@echo "postgres ready"
Loading