.PHONY: dev prod clean dev: docker-compose -f docker-compose.dev.yml up --build logs: docker-compose -f docker-compose.dev.yml logs -f prod: docker-compose -f docker-compose.prod.yml up --build clean: docker-compose -f docker-compose.dev.yml down -v docker-compose -f docker-compose.prod.yml down -v security-check: @echo "๐Ÿ” Running Static Application Security Testing (SAST)..." gosec -quiet ./... audit: @echo "๐Ÿ” Checking for known vulnerabilities in dependencies..." govulncheck ./... help: @echo "Available targets:" @echo " proto - Generate all protobuf files" @echo " proto-all - Generate all protobuf files with cleanup" @echo " generate-proto - Generate specific proto file (usage: make generate-proto FILE=path/to/file.proto)" @echo " generate-ethnic-grpc - Generate ethnic gRPC service" @echo " generate-person-grpc - Generate person gRPC service" @echo " clean - Clean generated files" @echo " build - Build the application" @echo " run - Run the application" @echo " test - Run tests" @echo " test-coverage - Run tests and generate coverage report" @echo " govulncheck - Check for vulnerabilities" @echo " seeder-build - Build the seeder CLI tool" @echo " seeder-list - List all available tables for seeding" @echo " seeder-seed - Seed specific table (usage: make seeder-seed TABLE=province)" @echo " seeder-seed-all - Seed all tables" @echo " seeder-dry-run - Dry run seeding for table (usage: make seeder-dry-run TABLE=province)" @echo " seeder-validate - Validate CSV files and configuration" # Generate specific proto file dengan penanganan error generate-proto: @if [ -z "$(FILE)" ]; then \ echo "โŒ Usage: make generate-proto FILE=path/to/file.proto"; \ echo "Example: make generate-proto FILE=internal/infrastructure/transport/grpc/proto/v1/ethnic.proto"; \ exit 1; \ fi @echo "๐Ÿš€ Generating protobuf code untuk: $(FILE)" @if command -v protoc-gen-validate &> /dev/null; then \ echo "โœ… protoc-gen-validate ditemukan, generate dengan validasi..."; \ protoc --go_out=. --go_opt=paths=source_relative \ --go-grpc_out=. --go-grpc_opt=paths=source_relative \ --validate_out="lang=go:." \ $(FILE); \ else \ echo "โš ๏ธ protoc-gen-validate tidak ditemukan, generate tanpa validasi..."; \ protoc --go_out=. --go_opt=paths=source_relative \ --go-grpc_out=. --go-grpc_opt=paths=source_relative \ $(FILE); \ fi # Seeder targets seeder-build: @echo "๐Ÿ”จ Building seeder CLI tool..." @go build -o bin/seeder cmd/seeder/main.go @echo "โœ… Seeder CLI built successfully at bin/seeder" seeder-list: seeder-build @echo "๐Ÿ“‹ Listing all available tables for seeding..." @./bin/seeder list seeder-seed: seeder-build @if [ -z "$(TABLE)" ]; then \ echo "โŒ Usage: make seeder-seed TABLE="; \ echo "Example: make seeder-seed TABLE=province"; \ echo "Available tables:"; \ ./bin/seeder list; \ exit 1; \ fi @echo "๐ŸŒฑ Seeding table: $(TABLE)" @./bin/seeder seed $(TABLE) seeder-seed-all: seeder-build @echo "๐ŸŒฑ Seeding all tables..." @./bin/seeder seed all seeder-dry-run: seeder-build @if [ -z "$(TABLE)" ]; then \ echo "โŒ Usage: make seeder-dry-run TABLE="; \ echo "Example: make seeder-dry-run TABLE=province"; \ exit 1; \ fi @echo "๐Ÿ” Dry-run seeding for table: $(TABLE)" @./bin/seeder dry-run $(TABLE) seeder-validate: seeder-build @echo "โœ… Validating all tables and CSV files..." @./bin/seeder validate all # Advanced seeder with options seeder-advanced: seeder-build @if [ -z "$(TABLE)" ]; then \ echo "โŒ Usage: make seeder-advanced TABLE= [OPTIONS]"; \ echo "Options:"; \ echo " BATCH_SIZE= - Set batch size"; \ echo " DELETE_BEFORE=1 - Delete existing data before seeding"; \ echo " CSV_PATH= - Override CSV file path"; \ exit 1; \ fi @echo "๐ŸŒฑ Advanced seeding for table: $(TABLE)" @./bin/seeder seed $(TABLE) -batch-size=$(or $(BATCH_SIZE),100) $(if $(DELETE_BEFORE),-delete-before,) $(if $(CSV_PATH),-csv-path=$(CSV_PATH),) clean-seeder: @echo "๐Ÿงน Cleaning seeder binary..." @rm -f bin/seeder @echo "โœ… Seeder binary cleaned" @echo "โœ… Proto code berhasil digenerate" # Generate all protobuf files proto: @echo "Generating all protobuf files..." @for proto in internal/infrastructure/transport/grpc/proto/v1/*.proto; do \ echo "Processing $$proto..."; \ if command -v protoc-gen-validate &> /dev/null; then \ protoc --go_out=. --go_opt=paths=source_relative \ --go-grpc_out=. --go-grpc_opt=paths=source_relative \ --validate_out="lang=go:." \ $$proto; \ else \ protoc --go_out=. --go_opt=paths=source_relative \ --go-grpc_out=. --go-grpc_opt=paths=source_relative \ $$proto; \ fi; \ done @echo "โœ… All protobuf files generated" # Generate all protobuf files with cleanup proto-all: clean-gen proto # Generate specific service (will be added by generator script) generate-ethnic-grpc: @echo "Generating ethnic gRPC service..." @if [ -f "internal/infrastructure/transport/grpc/proto/v1/ethnic.proto" ]; then \ if command -v protoc-gen-validate &> /dev/null; then \ protoc --go_out=. --go_opt=paths=source_relative \ --go-grpc_out=. --go-grpc_opt=paths=source_relative \ --validate_out="lang=go:." \ internal/infrastructure/transport/grpc/proto/v1/ethnic.proto; \ else \ protoc --go_out=. --go_opt=paths=source_relative \ --go-grpc_out=. --go-grpc_opt=paths=source_relative \ internal/infrastructure/transport/grpc/proto/v1/ethnic.proto; \ fi; \ else \ echo "โš ๏ธ File ethnic.proto tidak ditemukan, skip..."; \ fi @echo "โœ… Ethnic gRPC service generated" generate-person-grpc: @echo "Generating person gRPC service..." @if command -v protoc-gen-validate &> /dev/null; then \ protoc --go_out=. --go_opt=paths=source_relative \ --go-grpc_out=. --go-grpc_opt=paths=source_relative \ --validate_out="lang=go:." \ internal/infrastructure/transport/grpc/proto/v1/person.proto; \ else \ protoc --go_out=. --go_opt=paths=source_relative \ --go-grpc_out=. --go-grpc_opt=paths=source_relative \ internal/infrastructure/transport/grpc/proto/v1/person.proto; \ fi @echo "โœ… Person gRPC service generated" # Clean generated files clean-gen: @echo "Cleaning generated files..." @rm -rf internal/infrastructure/transport/grpc/gen/ @mkdir -p internal/infrastructure/transport/grpc/gen @echo "โœ… Generated files cleaned" # Generate village gRPC service generate-village-grpc: @echo "Generating village gRPC service..." @protoc --go_out=. --go_opt=paths=source_relative \ --go-grpc_out=. --go-grpc_opt=paths=source_relative \ --validate_out="lang=go:." \ --experimental_allow_proto3_optional \ internal/infrastructure/transport/grpc/proto/v1/village.proto @echo "โœ… village gRPC service generated" .PHONY: test test-coverage # Run tests test: @echo "๐Ÿงช Running tests..." @go test -v ./... # Run tests with coverage test-coverage: @echo "๐Ÿงช Running tests with coverage..." @go test -v -coverprofile=coverage.out ./... @go tool cover -html=coverage.out -o coverage.html @echo "โœ… Coverage report generated at coverage.html"