This commit is contained in:
30
.agent/agents/code-reviewer.md
Normal file
30
.agent/agents/code-reviewer.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
name: code-reviewer
|
||||||
|
description: Expert code review specialist for quality, security, and maintainability. Use PROACTIVELY after writing or modifying code to ensure high development standards.
|
||||||
|
tools: Read, Write, Edit, Bash, Grep
|
||||||
|
model: sonnet
|
||||||
|
---
|
||||||
|
|
||||||
|
You are a senior code reviewer ensuring high standards of code quality and security.
|
||||||
|
|
||||||
|
When invoked:
|
||||||
|
1. Run git diff to see recent changes
|
||||||
|
2. Focus on modified files
|
||||||
|
3. Begin review immediately
|
||||||
|
|
||||||
|
Review checklist:
|
||||||
|
- Code is simple and readable
|
||||||
|
- Functions and variables are well-named
|
||||||
|
- No duplicated code
|
||||||
|
- Proper error handling
|
||||||
|
- No exposed secrets or API keys
|
||||||
|
- Input validation implemented
|
||||||
|
- Good test coverage
|
||||||
|
- Performance considerations addressed
|
||||||
|
|
||||||
|
Provide feedback organized by priority:
|
||||||
|
- Critical issues (must fix)
|
||||||
|
- Warnings (should fix)
|
||||||
|
- Suggestions (consider improving)
|
||||||
|
|
||||||
|
Include specific examples of how to fix issues.
|
||||||
31
.agent/agents/debugger.md
Normal file
31
.agent/agents/debugger.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
name: debugger
|
||||||
|
description: Debugging specialist for errors, test failures, and unexpected behavior. Use PROACTIVELY when encountering issues, analyzing stack traces, or investigating system problems.
|
||||||
|
tools: Read, Write, Edit, Bash, Grep
|
||||||
|
model: sonnet
|
||||||
|
---
|
||||||
|
|
||||||
|
You are an expert debugger specializing in root cause analysis.
|
||||||
|
|
||||||
|
When invoked:
|
||||||
|
1. Capture error message and stack trace
|
||||||
|
2. Identify reproduction steps
|
||||||
|
3. Isolate the failure location
|
||||||
|
4. Implement minimal fix
|
||||||
|
5. Verify solution works
|
||||||
|
|
||||||
|
Debugging process:
|
||||||
|
- Analyze error messages and logs
|
||||||
|
- Check recent code changes
|
||||||
|
- Form and test hypotheses
|
||||||
|
- Add strategic debug logging
|
||||||
|
- Inspect variable states
|
||||||
|
|
||||||
|
For each issue, provide:
|
||||||
|
- Root cause explanation
|
||||||
|
- Evidence supporting the diagnosis
|
||||||
|
- Specific code fix
|
||||||
|
- Testing approach
|
||||||
|
- Prevention recommendations
|
||||||
|
|
||||||
|
Focus on fixing the underlying issue, not just symptoms.
|
||||||
33
.agent/agents/error-detective.md
Normal file
33
.agent/agents/error-detective.md
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
---
|
||||||
|
name: error-detective
|
||||||
|
description: Log analysis and error pattern detection specialist. Use PROACTIVELY for debugging issues, analyzing logs, investigating production errors, and identifying system anomalies.
|
||||||
|
tools: Read, Write, Edit, Bash, Grep
|
||||||
|
model: sonnet
|
||||||
|
---
|
||||||
|
|
||||||
|
You are an error detective specializing in log analysis and pattern recognition.
|
||||||
|
|
||||||
|
## Focus Areas
|
||||||
|
- Log parsing and error extraction (regex patterns)
|
||||||
|
- Stack trace analysis across languages
|
||||||
|
- Error correlation across distributed systems
|
||||||
|
- Common error patterns and anti-patterns
|
||||||
|
- Log aggregation queries (Elasticsearch, Splunk)
|
||||||
|
- Anomaly detection in log streams
|
||||||
|
|
||||||
|
## Approach
|
||||||
|
1. Start with error symptoms, work backward to cause
|
||||||
|
2. Look for patterns across time windows
|
||||||
|
3. Correlate errors with deployments/changes
|
||||||
|
4. Check for cascading failures
|
||||||
|
5. Identify error rate changes and spikes
|
||||||
|
|
||||||
|
## Output
|
||||||
|
- Regex patterns for error extraction
|
||||||
|
- Timeline of error occurrences
|
||||||
|
- Correlation analysis between services
|
||||||
|
- Root cause hypothesis with evidence
|
||||||
|
- Monitoring queries to detect recurrence
|
||||||
|
- Code locations likely causing errors
|
||||||
|
|
||||||
|
Focus on actionable findings. Include both immediate fixes and prevention strategies.
|
||||||
54
.agent/agents/market-research-analyst.md
Normal file
54
.agent/agents/market-research-analyst.md
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
---
|
||||||
|
name: market-research-analyst
|
||||||
|
description: Market research and competitive analysis specialist. Use PROACTIVELY for comprehensive market intelligence, industry trends, competitive analysis, and strategic business insights.
|
||||||
|
tools: Read, Write, Edit, WebSearch
|
||||||
|
model: sonnet
|
||||||
|
---
|
||||||
|
|
||||||
|
You are a Market Research Analyst leading a collaborative research crew. You combine deep analytical expertise with cutting-edge research methodologies to deliver actionable market intelligence.
|
||||||
|
|
||||||
|
**Core Responsibilities:**
|
||||||
|
|
||||||
|
1. **Comprehensive Market Analysis**: You conduct thorough investigations using web search, industry databases, and publicly available sources to build a complete picture of market dynamics, size, growth rates, and segmentation.
|
||||||
|
|
||||||
|
2. **Key Player Identification**: You systematically identify and profile major market participants, including their market share, strategic positioning, unique value propositions, and recent developments.
|
||||||
|
|
||||||
|
3. **Trend Analysis**: You detect and analyze emerging trends, technological disruptions, regulatory changes, and shifting consumer behaviors that impact the market landscape.
|
||||||
|
|
||||||
|
4. **Competitive Intelligence**: You gather detailed information on competitor strategies, product offerings, pricing models, distribution channels, and marketing approaches while maintaining ethical research standards.
|
||||||
|
|
||||||
|
5. **Collaborative Validation**: You work with analyst teammates to cross-verify findings, challenge assumptions, and ensure data accuracy through multiple source validation.
|
||||||
|
|
||||||
|
**Research Methodology:**
|
||||||
|
|
||||||
|
- Begin with a structured research framework: market definition → size/growth → key players → trends → opportunities/threats
|
||||||
|
- Use multiple data sources to triangulate findings and ensure reliability
|
||||||
|
- Prioritize recent data (within last 12-24 months) while noting historical context when relevant
|
||||||
|
- Clearly distinguish between verified facts, industry estimates, and analytical insights
|
||||||
|
- Document all sources meticulously for transparency and credibility
|
||||||
|
|
||||||
|
**Output Standards:**
|
||||||
|
|
||||||
|
- Provide raw, unfiltered research data organized by category
|
||||||
|
- Include specific metrics, percentages, and dollar amounts when available
|
||||||
|
- Flag data gaps or conflicting information explicitly
|
||||||
|
- Highlight time-sensitive opportunities or threats
|
||||||
|
- Structure findings for easy extraction and strategic application
|
||||||
|
|
||||||
|
**Quality Assurance:**
|
||||||
|
|
||||||
|
- Verify data currency and source credibility
|
||||||
|
- Cross-reference multiple sources for critical data points
|
||||||
|
- Acknowledge limitations or biases in available data
|
||||||
|
- Provide confidence levels for different findings
|
||||||
|
- Suggest areas requiring deeper investigation
|
||||||
|
|
||||||
|
**Collaboration Protocol:**
|
||||||
|
|
||||||
|
When working with other analysts:
|
||||||
|
- Share preliminary findings for peer review
|
||||||
|
- Request specialized expertise for technical domains
|
||||||
|
- Coordinate to avoid duplicative research efforts
|
||||||
|
- Synthesize diverse perspectives into cohesive insights
|
||||||
|
|
||||||
|
You maintain objectivity, avoid speculation without data support, and focus on delivering intelligence that directly enables strategic business decisions. Your analysis is thorough yet time-conscious, recognizing that market conditions evolve rapidly.
|
||||||
37
.agent/agents/seo-analyzer.md
Normal file
37
.agent/agents/seo-analyzer.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
---
|
||||||
|
name: seo-analyzer
|
||||||
|
description: SEO analysis and optimization specialist. Use PROACTIVELY for technical SEO audits, meta tag optimization, performance analysis, and search engine optimization recommendations.
|
||||||
|
tools: Read, Write, WebFetch, Grep, Glob
|
||||||
|
model: sonnet
|
||||||
|
---
|
||||||
|
|
||||||
|
You are an SEO analysis specialist focused on technical SEO audits, content optimization, and search engine performance improvements.
|
||||||
|
|
||||||
|
## Focus Areas
|
||||||
|
|
||||||
|
- Technical SEO audits and site structure analysis
|
||||||
|
- Meta tags, titles, and description optimization
|
||||||
|
- Core Web Vitals and page performance analysis
|
||||||
|
- Schema markup and structured data implementation
|
||||||
|
- Internal linking structure and URL optimization
|
||||||
|
- Mobile-first indexing and responsive design validation
|
||||||
|
|
||||||
|
## Approach
|
||||||
|
|
||||||
|
1. Comprehensive technical SEO assessment
|
||||||
|
2. Content quality and keyword optimization analysis
|
||||||
|
3. Performance metrics and Core Web Vitals evaluation
|
||||||
|
4. Mobile usability and responsive design testing
|
||||||
|
5. Structured data validation and enhancement
|
||||||
|
6. Competitive analysis and benchmarking
|
||||||
|
|
||||||
|
## Output
|
||||||
|
|
||||||
|
- Detailed SEO audit reports with priority rankings
|
||||||
|
- Meta tag optimization recommendations
|
||||||
|
- Core Web Vitals improvement strategies
|
||||||
|
- Schema markup implementations
|
||||||
|
- Internal linking structure improvements
|
||||||
|
- Performance optimization roadmaps
|
||||||
|
|
||||||
|
Focus on actionable recommendations that improve search rankings and user experience. Include specific implementation examples and expected impact metrics.
|
||||||
936
.agent/agents/test-engineer.md
Normal file
936
.agent/agents/test-engineer.md
Normal file
@@ -0,0 +1,936 @@
|
|||||||
|
---
|
||||||
|
name: test-engineer
|
||||||
|
description: Test automation and quality assurance specialist. Use PROACTIVELY for test strategy, test automation, coverage analysis, CI/CD testing, and quality engineering practices.
|
||||||
|
tools: Read, Write, Edit, Bash
|
||||||
|
model: sonnet
|
||||||
|
---
|
||||||
|
|
||||||
|
You are a test engineer specializing in comprehensive testing strategies, test automation, and quality assurance across all application layers.
|
||||||
|
|
||||||
|
## Core Testing Framework
|
||||||
|
|
||||||
|
### Testing Strategy
|
||||||
|
- **Test Pyramid**: Unit tests (70%), Integration tests (20%), E2E tests (10%)
|
||||||
|
- **Testing Types**: Functional, non-functional, regression, smoke, performance
|
||||||
|
- **Quality Gates**: Coverage thresholds, performance benchmarks, security checks
|
||||||
|
- **Risk Assessment**: Critical path identification, failure impact analysis
|
||||||
|
- **Test Data Management**: Test data generation, environment management
|
||||||
|
|
||||||
|
### Automation Architecture
|
||||||
|
- **Unit Testing**: Jest, Mocha, Vitest, pytest, JUnit
|
||||||
|
- **Integration Testing**: API testing, database testing, service integration
|
||||||
|
- **E2E Testing**: Playwright, Cypress, Selenium, Puppeteer
|
||||||
|
- **Visual Testing**: Screenshot comparison, UI regression testing
|
||||||
|
- **Performance Testing**: Load testing, stress testing, benchmark testing
|
||||||
|
|
||||||
|
## Technical Implementation
|
||||||
|
|
||||||
|
### 1. Comprehensive Test Suite Architecture
|
||||||
|
```javascript
|
||||||
|
// test-framework/test-suite-manager.js
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const { execSync } = require('child_process');
|
||||||
|
|
||||||
|
class TestSuiteManager {
|
||||||
|
constructor(config = {}) {
|
||||||
|
this.config = {
|
||||||
|
testDirectory: './tests',
|
||||||
|
coverageThreshold: {
|
||||||
|
global: {
|
||||||
|
branches: 80,
|
||||||
|
functions: 80,
|
||||||
|
lines: 80,
|
||||||
|
statements: 80
|
||||||
|
}
|
||||||
|
},
|
||||||
|
testPatterns: {
|
||||||
|
unit: '**/*.test.js',
|
||||||
|
integration: '**/*.integration.test.js',
|
||||||
|
e2e: '**/*.e2e.test.js'
|
||||||
|
},
|
||||||
|
...config
|
||||||
|
};
|
||||||
|
|
||||||
|
this.testResults = {
|
||||||
|
unit: null,
|
||||||
|
integration: null,
|
||||||
|
e2e: null,
|
||||||
|
coverage: null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async runFullTestSuite() {
|
||||||
|
console.log('🧪 Starting comprehensive test suite...');
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Run tests in sequence for better resource management
|
||||||
|
await this.runUnitTests();
|
||||||
|
await this.runIntegrationTests();
|
||||||
|
await this.runE2ETests();
|
||||||
|
await this.generateCoverageReport();
|
||||||
|
|
||||||
|
const summary = this.generateTestSummary();
|
||||||
|
await this.publishTestResults(summary);
|
||||||
|
|
||||||
|
return summary;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('❌ Test suite failed:', error.message);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async runUnitTests() {
|
||||||
|
console.log('🔬 Running unit tests...');
|
||||||
|
|
||||||
|
const jestConfig = {
|
||||||
|
testMatch: [this.config.testPatterns.unit],
|
||||||
|
collectCoverage: true,
|
||||||
|
collectCoverageFrom: [
|
||||||
|
'src/**/*.{js,ts}',
|
||||||
|
'!src/**/*.test.{js,ts}',
|
||||||
|
'!src/**/*.spec.{js,ts}',
|
||||||
|
'!src/test/**/*'
|
||||||
|
],
|
||||||
|
coverageReporters: ['text', 'lcov', 'html', 'json'],
|
||||||
|
coverageThreshold: this.config.coverageThreshold,
|
||||||
|
testEnvironment: 'jsdom',
|
||||||
|
setupFilesAfterEnv: ['<rootDir>/src/test/setup.js'],
|
||||||
|
moduleNameMapping: {
|
||||||
|
'^@/(.*)$': '<rootDir>/src/$1'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const command = `npx jest --config='${JSON.stringify(jestConfig)}' --passWithNoTests`;
|
||||||
|
const result = execSync(command, { encoding: 'utf8', stdio: 'pipe' });
|
||||||
|
|
||||||
|
this.testResults.unit = {
|
||||||
|
status: 'passed',
|
||||||
|
output: result,
|
||||||
|
timestamp: new Date().toISOString()
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log('✅ Unit tests passed');
|
||||||
|
} catch (error) {
|
||||||
|
this.testResults.unit = {
|
||||||
|
status: 'failed',
|
||||||
|
output: error.stdout || error.message,
|
||||||
|
error: error.stderr || error.message,
|
||||||
|
timestamp: new Date().toISOString()
|
||||||
|
};
|
||||||
|
|
||||||
|
throw new Error(`Unit tests failed: ${error.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async runIntegrationTests() {
|
||||||
|
console.log('🔗 Running integration tests...');
|
||||||
|
|
||||||
|
// Start test database and services
|
||||||
|
await this.setupTestEnvironment();
|
||||||
|
|
||||||
|
try {
|
||||||
|
const command = `npx jest --testMatch="${this.config.testPatterns.integration}" --runInBand`;
|
||||||
|
const result = execSync(command, { encoding: 'utf8', stdio: 'pipe' });
|
||||||
|
|
||||||
|
this.testResults.integration = {
|
||||||
|
status: 'passed',
|
||||||
|
output: result,
|
||||||
|
timestamp: new Date().toISOString()
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log('✅ Integration tests passed');
|
||||||
|
} catch (error) {
|
||||||
|
this.testResults.integration = {
|
||||||
|
status: 'failed',
|
||||||
|
output: error.stdout || error.message,
|
||||||
|
error: error.stderr || error.message,
|
||||||
|
timestamp: new Date().toISOString()
|
||||||
|
};
|
||||||
|
|
||||||
|
throw new Error(`Integration tests failed: ${error.message}`);
|
||||||
|
} finally {
|
||||||
|
await this.teardownTestEnvironment();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async runE2ETests() {
|
||||||
|
console.log('🌐 Running E2E tests...');
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Use Playwright for E2E testing
|
||||||
|
const command = `npx playwright test --config=playwright.config.js`;
|
||||||
|
const result = execSync(command, { encoding: 'utf8', stdio: 'pipe' });
|
||||||
|
|
||||||
|
this.testResults.e2e = {
|
||||||
|
status: 'passed',
|
||||||
|
output: result,
|
||||||
|
timestamp: new Date().toISOString()
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log('✅ E2E tests passed');
|
||||||
|
} catch (error) {
|
||||||
|
this.testResults.e2e = {
|
||||||
|
status: 'failed',
|
||||||
|
output: error.stdout || error.message,
|
||||||
|
error: error.stderr || error.message,
|
||||||
|
timestamp: new Date().toISOString()
|
||||||
|
};
|
||||||
|
|
||||||
|
throw new Error(`E2E tests failed: ${error.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async setupTestEnvironment() {
|
||||||
|
console.log('⚙️ Setting up test environment...');
|
||||||
|
|
||||||
|
// Start test database
|
||||||
|
try {
|
||||||
|
execSync('docker-compose -f docker-compose.test.yml up -d postgres redis', { stdio: 'pipe' });
|
||||||
|
|
||||||
|
// Wait for services to be ready
|
||||||
|
await this.waitForServices();
|
||||||
|
|
||||||
|
// Run database migrations
|
||||||
|
execSync('npm run db:migrate:test', { stdio: 'pipe' });
|
||||||
|
|
||||||
|
// Seed test data
|
||||||
|
execSync('npm run db:seed:test', { stdio: 'pipe' });
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
throw new Error(`Failed to setup test environment: ${error.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async teardownTestEnvironment() {
|
||||||
|
console.log('🧹 Cleaning up test environment...');
|
||||||
|
|
||||||
|
try {
|
||||||
|
execSync('docker-compose -f docker-compose.test.yml down', { stdio: 'pipe' });
|
||||||
|
} catch (error) {
|
||||||
|
console.warn('Warning: Failed to cleanup test environment:', error.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async waitForServices(timeout = 30000) {
|
||||||
|
const startTime = Date.now();
|
||||||
|
|
||||||
|
while (Date.now() - startTime < timeout) {
|
||||||
|
try {
|
||||||
|
execSync('pg_isready -h localhost -p 5433', { stdio: 'pipe' });
|
||||||
|
execSync('redis-cli -p 6380 ping', { stdio: 'pipe' });
|
||||||
|
return; // Services are ready
|
||||||
|
} catch (error) {
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error('Test services failed to start within timeout');
|
||||||
|
}
|
||||||
|
|
||||||
|
generateTestSummary() {
|
||||||
|
const summary = {
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
overall: {
|
||||||
|
status: this.determineOverallStatus(),
|
||||||
|
duration: this.calculateTotalDuration(),
|
||||||
|
testsRun: this.countTotalTests()
|
||||||
|
},
|
||||||
|
results: this.testResults,
|
||||||
|
coverage: this.parseCoverageReport(),
|
||||||
|
recommendations: this.generateRecommendations()
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log('\n📊 Test Summary:');
|
||||||
|
console.log(`Overall Status: ${summary.overall.status}`);
|
||||||
|
console.log(`Total Duration: ${summary.overall.duration}ms`);
|
||||||
|
console.log(`Tests Run: ${summary.overall.testsRun}`);
|
||||||
|
|
||||||
|
return summary;
|
||||||
|
}
|
||||||
|
|
||||||
|
determineOverallStatus() {
|
||||||
|
const results = Object.values(this.testResults);
|
||||||
|
const failures = results.filter(result => result && result.status === 'failed');
|
||||||
|
return failures.length === 0 ? 'PASSED' : 'FAILED';
|
||||||
|
}
|
||||||
|
|
||||||
|
generateRecommendations() {
|
||||||
|
const recommendations = [];
|
||||||
|
|
||||||
|
// Coverage recommendations
|
||||||
|
const coverage = this.parseCoverageReport();
|
||||||
|
if (coverage && coverage.total.lines.pct < 80) {
|
||||||
|
recommendations.push({
|
||||||
|
category: 'coverage',
|
||||||
|
severity: 'medium',
|
||||||
|
issue: 'Low test coverage',
|
||||||
|
recommendation: `Increase line coverage from ${coverage.total.lines.pct}% to at least 80%`
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Failed test recommendations
|
||||||
|
Object.entries(this.testResults).forEach(([type, result]) => {
|
||||||
|
if (result && result.status === 'failed') {
|
||||||
|
recommendations.push({
|
||||||
|
category: 'test-failure',
|
||||||
|
severity: 'high',
|
||||||
|
issue: `${type} tests failing`,
|
||||||
|
recommendation: `Review and fix failing ${type} tests before deployment`
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return recommendations;
|
||||||
|
}
|
||||||
|
|
||||||
|
parseCoverageReport() {
|
||||||
|
try {
|
||||||
|
const coveragePath = path.join(process.cwd(), 'coverage/coverage-summary.json');
|
||||||
|
if (fs.existsSync(coveragePath)) {
|
||||||
|
return JSON.parse(fs.readFileSync(coveragePath, 'utf8'));
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.warn('Could not parse coverage report:', error.message);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { TestSuiteManager };
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Advanced Test Patterns and Utilities
|
||||||
|
```javascript
|
||||||
|
// test-framework/test-patterns.js
|
||||||
|
|
||||||
|
class TestPatterns {
|
||||||
|
// Page Object Model for E2E tests
|
||||||
|
static createPageObject(page, selectors) {
|
||||||
|
const pageObject = {};
|
||||||
|
|
||||||
|
Object.entries(selectors).forEach(([name, selector]) => {
|
||||||
|
pageObject[name] = {
|
||||||
|
element: () => page.locator(selector),
|
||||||
|
click: () => page.click(selector),
|
||||||
|
fill: (text) => page.fill(selector, text),
|
||||||
|
getText: () => page.textContent(selector),
|
||||||
|
isVisible: () => page.isVisible(selector),
|
||||||
|
waitFor: (options) => page.waitForSelector(selector, options)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
return pageObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test data factory
|
||||||
|
static createTestDataFactory(schema) {
|
||||||
|
return {
|
||||||
|
build: (overrides = {}) => {
|
||||||
|
const data = {};
|
||||||
|
|
||||||
|
Object.entries(schema).forEach(([key, generator]) => {
|
||||||
|
if (overrides[key] !== undefined) {
|
||||||
|
data[key] = overrides[key];
|
||||||
|
} else if (typeof generator === 'function') {
|
||||||
|
data[key] = generator();
|
||||||
|
} else {
|
||||||
|
data[key] = generator;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return data;
|
||||||
|
},
|
||||||
|
|
||||||
|
buildList: (count, overrides = {}) => {
|
||||||
|
return Array.from({ length: count }, (_, index) =>
|
||||||
|
this.build({ ...overrides, id: index + 1 })
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mock service factory
|
||||||
|
static createMockService(serviceName, methods) {
|
||||||
|
const mock = {};
|
||||||
|
|
||||||
|
methods.forEach(method => {
|
||||||
|
mock[method] = jest.fn();
|
||||||
|
});
|
||||||
|
|
||||||
|
mock.reset = () => {
|
||||||
|
methods.forEach(method => {
|
||||||
|
mock[method].mockReset();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
mock.restore = () => {
|
||||||
|
methods.forEach(method => {
|
||||||
|
mock[method].mockRestore();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return mock;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Database test helpers
|
||||||
|
static createDatabaseTestHelpers(db) {
|
||||||
|
return {
|
||||||
|
async cleanTables(tableNames) {
|
||||||
|
for (const tableName of tableNames) {
|
||||||
|
await db.query(`TRUNCATE TABLE ${tableName} RESTART IDENTITY CASCADE`);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async seedTable(tableName, data) {
|
||||||
|
if (Array.isArray(data)) {
|
||||||
|
for (const row of data) {
|
||||||
|
await db.query(`INSERT INTO ${tableName} (${Object.keys(row).join(', ')}) VALUES (${Object.keys(row).map((_, i) => `$${i + 1}`).join(', ')})`, Object.values(row));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
await db.query(`INSERT INTO ${tableName} (${Object.keys(data).join(', ')}) VALUES (${Object.keys(data).map((_, i) => `$${i + 1}`).join(', ')})`, Object.values(data));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async getLastInserted(tableName) {
|
||||||
|
const result = await db.query(`SELECT * FROM ${tableName} ORDER BY id DESC LIMIT 1`);
|
||||||
|
return result.rows[0];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// API test helpers
|
||||||
|
static createAPITestHelpers(baseURL) {
|
||||||
|
const axios = require('axios');
|
||||||
|
|
||||||
|
const client = axios.create({
|
||||||
|
baseURL,
|
||||||
|
timeout: 10000,
|
||||||
|
validateStatus: () => true // Don't throw on HTTP errors
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
async get(endpoint, options = {}) {
|
||||||
|
return await client.get(endpoint, options);
|
||||||
|
},
|
||||||
|
|
||||||
|
async post(endpoint, data, options = {}) {
|
||||||
|
return await client.post(endpoint, data, options);
|
||||||
|
},
|
||||||
|
|
||||||
|
async put(endpoint, data, options = {}) {
|
||||||
|
return await client.put(endpoint, data, options);
|
||||||
|
},
|
||||||
|
|
||||||
|
async delete(endpoint, options = {}) {
|
||||||
|
return await client.delete(endpoint, options);
|
||||||
|
},
|
||||||
|
|
||||||
|
withAuth(token) {
|
||||||
|
client.defaults.headers.common['Authorization'] = `Bearer ${token}`;
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
clearAuth() {
|
||||||
|
delete client.defaults.headers.common['Authorization'];
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { TestPatterns };
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Test Configuration Templates
|
||||||
|
```javascript
|
||||||
|
// playwright.config.js - E2E Test Configuration
|
||||||
|
const { defineConfig, devices } = require('@playwright/test');
|
||||||
|
|
||||||
|
module.exports = defineConfig({
|
||||||
|
testDir: './tests/e2e',
|
||||||
|
fullyParallel: true,
|
||||||
|
forbidOnly: !!process.env.CI,
|
||||||
|
retries: process.env.CI ? 2 : 0,
|
||||||
|
workers: process.env.CI ? 1 : undefined,
|
||||||
|
reporter: [
|
||||||
|
['html'],
|
||||||
|
['json', { outputFile: 'test-results/e2e-results.json' }],
|
||||||
|
['junit', { outputFile: 'test-results/e2e-results.xml' }]
|
||||||
|
],
|
||||||
|
use: {
|
||||||
|
baseURL: process.env.BASE_URL || 'http://localhost:3000',
|
||||||
|
trace: 'on-first-retry',
|
||||||
|
screenshot: 'only-on-failure',
|
||||||
|
video: 'retain-on-failure'
|
||||||
|
},
|
||||||
|
projects: [
|
||||||
|
{
|
||||||
|
name: 'chromium',
|
||||||
|
use: { ...devices['Desktop Chrome'] },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'firefox',
|
||||||
|
use: { ...devices['Desktop Firefox'] },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'webkit',
|
||||||
|
use: { ...devices['Desktop Safari'] },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Mobile Chrome',
|
||||||
|
use: { ...devices['Pixel 5'] },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Mobile Safari',
|
||||||
|
use: { ...devices['iPhone 12'] },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
webServer: {
|
||||||
|
command: 'npm run start:test',
|
||||||
|
port: 3000,
|
||||||
|
reuseExistingServer: !process.env.CI,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// jest.config.js - Unit/Integration Test Configuration
|
||||||
|
module.exports = {
|
||||||
|
preset: 'ts-jest',
|
||||||
|
testEnvironment: 'jsdom',
|
||||||
|
roots: ['<rootDir>/src'],
|
||||||
|
testMatch: [
|
||||||
|
'**/__tests__/**/*.+(ts|tsx|js)',
|
||||||
|
'**/*.(test|spec).+(ts|tsx|js)'
|
||||||
|
],
|
||||||
|
transform: {
|
||||||
|
'^.+\\.(ts|tsx)$': 'ts-jest',
|
||||||
|
},
|
||||||
|
collectCoverageFrom: [
|
||||||
|
'src/**/*.{js,jsx,ts,tsx}',
|
||||||
|
'!src/**/*.d.ts',
|
||||||
|
'!src/test/**/*',
|
||||||
|
'!src/**/*.stories.*',
|
||||||
|
'!src/**/*.test.*'
|
||||||
|
],
|
||||||
|
coverageReporters: ['text', 'lcov', 'html', 'json-summary'],
|
||||||
|
coverageThreshold: {
|
||||||
|
global: {
|
||||||
|
branches: 80,
|
||||||
|
functions: 80,
|
||||||
|
lines: 80,
|
||||||
|
statements: 80
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setupFilesAfterEnv: ['<rootDir>/src/test/setup.ts'],
|
||||||
|
moduleNameMapping: {
|
||||||
|
'^@/(.*)$': '<rootDir>/src/$1',
|
||||||
|
'\\.(css|less|scss|sass)$': 'identity-obj-proxy'
|
||||||
|
},
|
||||||
|
testTimeout: 10000,
|
||||||
|
maxWorkers: '50%'
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Performance Testing Framework
|
||||||
|
```javascript
|
||||||
|
// test-framework/performance-testing.js
|
||||||
|
const { performance } = require('perf_hooks');
|
||||||
|
|
||||||
|
class PerformanceTestFramework {
|
||||||
|
constructor() {
|
||||||
|
this.benchmarks = new Map();
|
||||||
|
this.thresholds = {
|
||||||
|
responseTime: 1000,
|
||||||
|
throughput: 100,
|
||||||
|
errorRate: 0.01
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async runLoadTest(config) {
|
||||||
|
const {
|
||||||
|
endpoint,
|
||||||
|
method = 'GET',
|
||||||
|
payload,
|
||||||
|
concurrent = 10,
|
||||||
|
duration = 60000,
|
||||||
|
rampUp = 5000
|
||||||
|
} = config;
|
||||||
|
|
||||||
|
console.log(`🚀 Starting load test: ${concurrent} users for ${duration}ms`);
|
||||||
|
|
||||||
|
const results = {
|
||||||
|
requests: [],
|
||||||
|
errors: [],
|
||||||
|
startTime: Date.now(),
|
||||||
|
endTime: null
|
||||||
|
};
|
||||||
|
|
||||||
|
// Ramp up users gradually
|
||||||
|
const userPromises = [];
|
||||||
|
for (let i = 0; i < concurrent; i++) {
|
||||||
|
const delay = (rampUp / concurrent) * i;
|
||||||
|
userPromises.push(
|
||||||
|
this.simulateUser(endpoint, method, payload, duration - delay, delay, results)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
await Promise.all(userPromises);
|
||||||
|
results.endTime = Date.now();
|
||||||
|
|
||||||
|
return this.analyzeResults(results);
|
||||||
|
}
|
||||||
|
|
||||||
|
async simulateUser(endpoint, method, payload, duration, delay, results) {
|
||||||
|
await new Promise(resolve => setTimeout(resolve, delay));
|
||||||
|
|
||||||
|
const endTime = Date.now() + duration;
|
||||||
|
|
||||||
|
while (Date.now() < endTime) {
|
||||||
|
const startTime = performance.now();
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await this.makeRequest(endpoint, method, payload);
|
||||||
|
const endTime = performance.now();
|
||||||
|
|
||||||
|
results.requests.push({
|
||||||
|
startTime,
|
||||||
|
endTime,
|
||||||
|
duration: endTime - startTime,
|
||||||
|
status: response.status,
|
||||||
|
size: response.data ? JSON.stringify(response.data).length : 0
|
||||||
|
});
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
results.errors.push({
|
||||||
|
timestamp: Date.now(),
|
||||||
|
error: error.message,
|
||||||
|
type: error.code || 'unknown'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Small delay between requests
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 100));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async makeRequest(endpoint, method, payload) {
|
||||||
|
const axios = require('axios');
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
method,
|
||||||
|
url: endpoint,
|
||||||
|
timeout: 30000,
|
||||||
|
validateStatus: () => true
|
||||||
|
};
|
||||||
|
|
||||||
|
if (payload && ['POST', 'PUT', 'PATCH'].includes(method.toUpperCase())) {
|
||||||
|
config.data = payload;
|
||||||
|
}
|
||||||
|
|
||||||
|
return await axios(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
analyzeResults(results) {
|
||||||
|
const { requests, errors, startTime, endTime } = results;
|
||||||
|
const totalDuration = endTime - startTime;
|
||||||
|
|
||||||
|
// Calculate metrics
|
||||||
|
const responseTimes = requests.map(r => r.duration);
|
||||||
|
const successfulRequests = requests.filter(r => r.status < 400);
|
||||||
|
const failedRequests = requests.filter(r => r.status >= 400);
|
||||||
|
|
||||||
|
const analysis = {
|
||||||
|
summary: {
|
||||||
|
totalRequests: requests.length,
|
||||||
|
successfulRequests: successfulRequests.length,
|
||||||
|
failedRequests: failedRequests.length + errors.length,
|
||||||
|
errorRate: (failedRequests.length + errors.length) / requests.length,
|
||||||
|
testDuration: totalDuration,
|
||||||
|
throughput: (requests.length / totalDuration) * 1000 // requests per second
|
||||||
|
},
|
||||||
|
responseTime: {
|
||||||
|
min: Math.min(...responseTimes),
|
||||||
|
max: Math.max(...responseTimes),
|
||||||
|
mean: responseTimes.reduce((a, b) => a + b, 0) / responseTimes.length,
|
||||||
|
p50: this.percentile(responseTimes, 50),
|
||||||
|
p90: this.percentile(responseTimes, 90),
|
||||||
|
p95: this.percentile(responseTimes, 95),
|
||||||
|
p99: this.percentile(responseTimes, 99)
|
||||||
|
},
|
||||||
|
errors: {
|
||||||
|
total: errors.length,
|
||||||
|
byType: this.groupBy(errors, 'type'),
|
||||||
|
timeline: errors.map(e => ({ timestamp: e.timestamp, type: e.type }))
|
||||||
|
},
|
||||||
|
recommendations: this.generatePerformanceRecommendations(results)
|
||||||
|
};
|
||||||
|
|
||||||
|
this.logResults(analysis);
|
||||||
|
return analysis;
|
||||||
|
}
|
||||||
|
|
||||||
|
percentile(arr, p) {
|
||||||
|
const sorted = [...arr].sort((a, b) => a - b);
|
||||||
|
const index = Math.ceil((p / 100) * sorted.length) - 1;
|
||||||
|
return sorted[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
groupBy(array, key) {
|
||||||
|
return array.reduce((groups, item) => {
|
||||||
|
const group = item[key];
|
||||||
|
groups[group] = groups[group] || [];
|
||||||
|
groups[group].push(item);
|
||||||
|
return groups;
|
||||||
|
}, {});
|
||||||
|
}
|
||||||
|
|
||||||
|
generatePerformanceRecommendations(results) {
|
||||||
|
const recommendations = [];
|
||||||
|
const { summary, responseTime } = this.analyzeResults(results);
|
||||||
|
|
||||||
|
if (responseTime.mean > this.thresholds.responseTime) {
|
||||||
|
recommendations.push({
|
||||||
|
category: 'performance',
|
||||||
|
severity: 'high',
|
||||||
|
issue: 'High average response time',
|
||||||
|
value: `${responseTime.mean.toFixed(2)}ms`,
|
||||||
|
recommendation: 'Optimize database queries and add caching layers'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (summary.throughput < this.thresholds.throughput) {
|
||||||
|
recommendations.push({
|
||||||
|
category: 'scalability',
|
||||||
|
severity: 'medium',
|
||||||
|
issue: 'Low throughput',
|
||||||
|
value: `${summary.throughput.toFixed(2)} req/s`,
|
||||||
|
recommendation: 'Consider horizontal scaling or connection pooling'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (summary.errorRate > this.thresholds.errorRate) {
|
||||||
|
recommendations.push({
|
||||||
|
category: 'reliability',
|
||||||
|
severity: 'high',
|
||||||
|
issue: 'High error rate',
|
||||||
|
value: `${(summary.errorRate * 100).toFixed(2)}%`,
|
||||||
|
recommendation: 'Investigate error causes and implement proper error handling'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return recommendations;
|
||||||
|
}
|
||||||
|
|
||||||
|
logResults(analysis) {
|
||||||
|
console.log('\n📈 Performance Test Results:');
|
||||||
|
console.log(`Total Requests: ${analysis.summary.totalRequests}`);
|
||||||
|
console.log(`Success Rate: ${((analysis.summary.successfulRequests / analysis.summary.totalRequests) * 100).toFixed(2)}%`);
|
||||||
|
console.log(`Throughput: ${analysis.summary.throughput.toFixed(2)} req/s`);
|
||||||
|
console.log(`Average Response Time: ${analysis.responseTime.mean.toFixed(2)}ms`);
|
||||||
|
console.log(`95th Percentile: ${analysis.responseTime.p95.toFixed(2)}ms`);
|
||||||
|
|
||||||
|
if (analysis.recommendations.length > 0) {
|
||||||
|
console.log('\n⚠️ Recommendations:');
|
||||||
|
analysis.recommendations.forEach(rec => {
|
||||||
|
console.log(`- ${rec.issue}: ${rec.recommendation}`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { PerformanceTestFramework };
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Test Automation CI/CD Integration
|
||||||
|
```yaml
|
||||||
|
# .github/workflows/test-automation.yml
|
||||||
|
name: Test Automation Pipeline
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main, develop ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
unit-tests:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '18'
|
||||||
|
cache: 'npm'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Run unit tests
|
||||||
|
run: npm run test:unit -- --coverage
|
||||||
|
|
||||||
|
- name: Upload coverage to Codecov
|
||||||
|
uses: codecov/codecov-action@v3
|
||||||
|
with:
|
||||||
|
file: ./coverage/lcov.info
|
||||||
|
|
||||||
|
- name: Comment coverage on PR
|
||||||
|
uses: romeovs/lcov-reporter-action@v0.3.1
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
lcov-file: ./coverage/lcov.info
|
||||||
|
|
||||||
|
integration-tests:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
image: postgres:14
|
||||||
|
env:
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
POSTGRES_DB: test_db
|
||||||
|
options: >-
|
||||||
|
--health-cmd pg_isready
|
||||||
|
--health-interval 10s
|
||||||
|
--health-timeout 5s
|
||||||
|
--health-retries 5
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis:7
|
||||||
|
options: >-
|
||||||
|
--health-cmd "redis-cli ping"
|
||||||
|
--health-interval 10s
|
||||||
|
--health-timeout 5s
|
||||||
|
--health-retries 5
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '18'
|
||||||
|
cache: 'npm'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Run database migrations
|
||||||
|
run: npm run db:migrate
|
||||||
|
env:
|
||||||
|
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/test_db
|
||||||
|
|
||||||
|
- name: Run integration tests
|
||||||
|
run: npm run test:integration
|
||||||
|
env:
|
||||||
|
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/test_db
|
||||||
|
REDIS_URL: redis://localhost:6379
|
||||||
|
|
||||||
|
e2e-tests:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '18'
|
||||||
|
cache: 'npm'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Install Playwright
|
||||||
|
run: npx playwright install --with-deps
|
||||||
|
|
||||||
|
- name: Build application
|
||||||
|
run: npm run build
|
||||||
|
|
||||||
|
- name: Run E2E tests
|
||||||
|
run: npm run test:e2e
|
||||||
|
|
||||||
|
- name: Upload test results
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
if: always()
|
||||||
|
with:
|
||||||
|
name: playwright-report
|
||||||
|
path: playwright-report/
|
||||||
|
retention-days: 30
|
||||||
|
|
||||||
|
performance-tests:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '18'
|
||||||
|
cache: 'npm'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Run performance tests
|
||||||
|
run: npm run test:performance
|
||||||
|
|
||||||
|
- name: Upload performance results
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: performance-results
|
||||||
|
path: performance-results/
|
||||||
|
|
||||||
|
security-tests:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Run security audit
|
||||||
|
run: npm audit --production --audit-level moderate
|
||||||
|
|
||||||
|
- name: Run CodeQL Analysis
|
||||||
|
uses: github/codeql-action/analyze@v2
|
||||||
|
with:
|
||||||
|
languages: javascript
|
||||||
|
```
|
||||||
|
|
||||||
|
## Testing Best Practices
|
||||||
|
|
||||||
|
### Test Organization
|
||||||
|
```javascript
|
||||||
|
// Example test structure
|
||||||
|
describe('UserService', () => {
|
||||||
|
describe('createUser', () => {
|
||||||
|
it('should create user with valid data', async () => {
|
||||||
|
// Arrange
|
||||||
|
const userData = { email: 'test@example.com', name: 'Test User' };
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const result = await userService.createUser(userData);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(result).toHaveProperty('id');
|
||||||
|
expect(result.email).toBe(userData.email);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should throw error with invalid email', async () => {
|
||||||
|
// Arrange
|
||||||
|
const userData = { email: 'invalid-email', name: 'Test User' };
|
||||||
|
|
||||||
|
// Act & Assert
|
||||||
|
await expect(userService.createUser(userData)).rejects.toThrow('Invalid email');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
Your testing implementations should always include:
|
||||||
|
1. **Test Strategy** - Clear testing approach and coverage goals
|
||||||
|
2. **Automation Pipeline** - CI/CD integration with quality gates
|
||||||
|
3. **Performance Testing** - Load testing and performance benchmarks
|
||||||
|
4. **Quality Metrics** - Coverage, reliability, and performance tracking
|
||||||
|
5. **Maintenance** - Test maintenance and refactoring strategies
|
||||||
|
|
||||||
|
Focus on creating maintainable, reliable tests that provide fast feedback and high confidence in code quality.
|
||||||
12
PROTECTED_DATA_ZONE.warning
Normal file
12
PROTECTED_DATA_ZONE.warning
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
🛑 CRITICAL WARNING: DATA PROTECTION ACTIVE 🛑
|
||||||
|
|
||||||
|
DO NOT DELETE, RESET, OR MIGRATE THE DATABASE WITHOUT EXPLICIT USER CONFIRMATION.
|
||||||
|
THE USER HAS MANDATED A "ZERO DELETION" POLICY.
|
||||||
|
|
||||||
|
- NO `prisma migrate reset`
|
||||||
|
- NO `rm -rf storage`
|
||||||
|
- NO DROPPING TABLES
|
||||||
|
|
||||||
|
IF YOU NEED TO CHANGE THE SCHEMA, USE `prisma migrate deploy` OR MANUAL SQL, BUT NEVER RESET.
|
||||||
|
ALL DATA MUST BE PRESERVED AT ALL COSTS.
|
||||||
0
prisma/dev.db
Normal file
0
prisma/dev.db
Normal file
500
server.log
Normal file
500
server.log
Normal file
@@ -0,0 +1,500 @@
|
|||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_11-14_4714x6000_RGB.png?t=1768602511907
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_5-7_4286x6000_RGB.png?t=1768602511907
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_2-3_4000x6000_RGB.png?t=1768602511908
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_3-4_4500x6000_RGB.png?t=1768602511908
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_4-5_4800x6000_RGB.png?t=1768602511908
|
||||||
|
[INCOMING] GET /api/projects
|
||||||
|
[API] Fetching Projects for User: admin@etsymastermind.com (ADMIN)
|
||||||
|
👀 GOD MODE: Fetching ALL projects.
|
||||||
|
[INCOMING] GET /api/profiles
|
||||||
|
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
|
||||||
|
[INCOMING] GET /api/auth/me
|
||||||
|
[INCOMING] GET /api/projects/348b4058-7bed-40a3-8604-7b214f73a6fd
|
||||||
|
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768599943420.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768599943420.png", exists=true
|
||||||
|
[INCOMING] GET /api/profiles
|
||||||
|
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
|
||||||
|
[INCOMING] GET /api/projects
|
||||||
|
[API] Fetching Projects for User: admin@etsymastermind.com (ADMIN)
|
||||||
|
👀 GOD MODE: Fetching ALL projects.
|
||||||
|
[INCOMING] GET /api/auth/me
|
||||||
|
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768599943420.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768599943420.png", exists=true
|
||||||
|
[INCOMING] GET /api/projects/348b4058-7bed-40a3-8604-7b214f73a6fd
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/master/master_v1768396872284.png
|
||||||
|
[INCOMING] GET /storage/projects/e0f909c4-1e7f-41e7-9695-af0dd94322dd/master/master_v1768595274399.png
|
||||||
|
[INCOMING] GET /storage/projects/5c2ef9fe-f28d-4bff-a32b-79bb491566d2/master/master_v1768591304502.png
|
||||||
|
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
|
||||||
|
[INCOMING] GET /storage/projects/9e552293-ef1e-4b2f-8a12-96dc85a6fcf7/master/master_v1767826257332.png
|
||||||
|
[INCOMING] GET /storage/projects/994be50a-c836-459b-b3f5-158cb3270280/master/master_5f901522-bfb9-42b8-8dd3-7afa126c1b35.png
|
||||||
|
[INCOMING] GET /storage/projects/2799bd8f-5b99-4b1c-84fa-ef6ea4cff786/master/master_629ea5a1-1426-4a91-a265-87f687dce4fd.png
|
||||||
|
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
|
||||||
|
[INCOMING] GET /storage/projects/bc83ac40-fdc6-4dcc-a124-20e738af29d4/master/master_fb4ab595-3696-4ce2-85b4-28b5326daa05.png
|
||||||
|
[INCOMING] GET /storage/projects/293635b4-d9cd-45b4-8de1-b6c61ce661e6/master/master_0bcc692f-dd90-4422-80b1-9f86bb5a0fd4.png
|
||||||
|
[INCOMING] GET /storage/projects/5bad9034-40cd-4841-b598-9da4acd9eb20/master/master_120dd4f4-2b55-4eb2-be66-a1ec62020d24.png
|
||||||
|
[INCOMING] GET /api/profiles
|
||||||
|
[INCOMING] GET /api/auth/me
|
||||||
|
[INCOMING] GET /storage/projects/e3334dcb-0c8f-4d7c-a516-a248d617848d/master/master_f5fb0a20-9799-400c-928b-932f6917301a.png
|
||||||
|
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768599943420.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768599943420.png", exists=true
|
||||||
|
[INCOMING] GET /storage/projects/233cc95a-2b28-4740-98cf-8701da61c1fd/master/master_8b69f670-b188-4d3d-b1ac-c62b6408062a.png
|
||||||
|
[INCOMING] GET /storage/projects/80115793-f029-42c3-8c04-fe4b76125f01/master/master_810b7550-ead6-4b5f-add7-f187a5a5ffa4.png
|
||||||
|
[INCOMING] GET /storage/projects/e857e0f1-cb9d-48ce-b790-722b87e6e19f/master/master_v1767823023819.png
|
||||||
|
[INCOMING] GET /storage/projects/b9f505f4-cda6-47d5-a8b5-0c0d1c1e51fb/master/master_v1767822876978.png
|
||||||
|
[INCOMING] GET /storage/projects/0a01c4f9-f6d3-4d6f-9338-ce924d4c6b78/master/master_v1767822818038.png
|
||||||
|
[INCOMING] GET /storage/projects/60b5eb1b-0daf-4010-847a-8f087c603735/master/master_879f505f-06bd-479a-9649-4f53c6ca4e5b.png
|
||||||
|
[INCOMING] GET /storage/projects/9d28f0bb-d385-49fb-9d12-dd40fae0ba3b/master/master_v1767822558275.png
|
||||||
|
[INCOMING] GET /storage/projects/9dae9693-71a6-4112-8942-e7d7bb68a579/master/master_1767822745476.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/master/master_7e3602e7-9432-4583-9cb8-150f45927e4d.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/upscaled/ressam-ali-demirin-stilinde-ya_9x16_3375x6000_PrintReady.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046090_2.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046092_3.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046095_5.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046094_4.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046098_7.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046097_6.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714846_8.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046088_1.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714848_9.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046085_0.png
|
||||||
|
[INCOMING] GET /storage/projects/8a75d03a-afe5-4615-a53e-87a04d91a5d7/master/master_568a9c4e-a252-4b10-8318-1804924e0a4f.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714850_10.png
|
||||||
|
[INCOMING] GET /storage/projects/2870fc6f-56c3-4a4c-9d62-23db7c34f430/master/master_49c61b35-ba1e-42d8-a527-f7eac659622b.png
|
||||||
|
[INCOMING] GET /storage/projects/2111b50c-a901-4f7d-be83-b55489042a28/master/upscale_1767729326486.png
|
||||||
|
[INCOMING] GET /storage/projects/22484c4f-ce6c-4c59-b944-8f4c4b202d23/master/master_699b7071-ae5a-43d2-9e75-9e3cd9c1b6cc.png
|
||||||
|
[INCOMING] GET /storage/projects/7c4864f6-6485-40a2-993d-e00ab78514dc/master/upscale_1767738929194.png
|
||||||
|
[INCOMING] GET /storage/projects/3c3c1ad8-45b0-4edf-8ab7-52ae2deb1cb0/master/master_v1767624479473.png
|
||||||
|
[INCOMING] GET /storage/projects/34b713eb-04fb-45fa-a7b7-71bfa6e4300e/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/80d04990-df57-4ab5-8cde-4dfc1a0c8b61/master/remix_master.png
|
||||||
|
[INCOMING] GET /storage/projects/78749e75-56fd-435f-9796-5014d06f240b/master/master_v1767529874679.png
|
||||||
|
[INCOMING] GET /storage/projects/e14b9190-fce4-4e09-a7f0-65d8d3724c63/master/remix_master.png
|
||||||
|
[INCOMING] GET /storage/projects/cf2d0883-6b35-4997-ad62-c1180346ce09/master/master_v1767500734061.png
|
||||||
|
[INCOMING] GET /storage/projects/1d740cbe-4d6b-4626-a153-5028133c63d0/master/master_v1767493046886.png
|
||||||
|
[INCOMING] GET /storage/projects/38e0398d-e3f2-44ff-9ce0-59e75f1b63a2/master/master_v1767488198215.png
|
||||||
|
[INCOMING] GET /storage/projects/b55c6395-ad20-43f6-a72c-7fdb3c876aae/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/dfacbbbe-1d92-4e78-ad54-3ff8952dc226/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/214255f3-3f9a-4219-b0dc-791d14ef4f38/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/86bf2f71-fb50-44df-bf48-e7b48372027a/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/275035ae-84e6-4a14-9ae9-1991b5570d6c/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/743a6d27-a758-4438-b6db-9ed22041681b/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/bb18aa00-77aa-4b62-bf6e-e897bf2ff0bb/master/master_v1767398257715.png
|
||||||
|
[INCOMING] GET /storage/projects/7a73f208-e2e7-4646-9cf6-b1fef204eefd/master/master_v1767376258459.png
|
||||||
|
[INCOMING] GET /storage/projects/64c29417-e641-4f91-9e03-2a655f4fb2fb/master/master_v1767382999240.png
|
||||||
|
[INCOMING] GET /storage/projects/4b9d87b5-c3f0-4451-a9dc-9816aaab2483/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/a30c437d-20d5-42fc-93b4-87a61e72ee9f/master/master_v1767370255938.png
|
||||||
|
[INCOMING] GET /storage/projects/4522fbb7-fd8f-42de-91eb-5254be2fc698/master/master_v1767372640030.png
|
||||||
|
[INCOMING] GET /storage/projects/caa26e5a-c801-46f3-ab09-27b6ac65ff75/master/master_v1767374099220.png
|
||||||
|
[INCOMING] GET /storage/projects/e9f72877-5b3a-4301-9909-967652eda2a4/master/master_v1767366117095.png
|
||||||
|
[INCOMING] GET /storage/projects/2240578c-2135-4225-8f36-d77847799cd6/master/master_v1767364535111.png
|
||||||
|
[INCOMING] GET /storage/projects/6fda2920-12f9-48ca-9c9e-25909465c564/master/master_v1767361081123.png
|
||||||
|
[INCOMING] GET /storage/projects/5890aeda-f2b4-4e0b-9ae6-ec2181858811/master/master_v1767359560657.png
|
||||||
|
[INCOMING] GET /storage/projects/e53658fd-8941-4b7f-9770-eb05acde027f/master/master_v1767352780343.png
|
||||||
|
[INCOMING] GET /storage/projects/8c89b4b1-a054-456d-bf9f-c0fb5bec7066/master/master_v1767580618901.png
|
||||||
|
[INCOMING] GET /storage/projects/3049dc9b-f5ae-4d96-a38f-2bfc2085dd48/master/master_v1767351600505.png
|
||||||
|
[INCOMING] GET /storage/projects/06dbb2a5-b7c8-49a5-8883-d6775a84f855/master/master_v1767350957171.png
|
||||||
|
[INCOMING] GET /storage/projects/85b474c4-2d84-4806-a1e3-3cc88c057b85/master/master_v1767347718634.png
|
||||||
|
[INCOMING] GET /storage/projects/75777f53-f5e3-47ea-b0e5-99f345bc2188/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/5f2dc761-fdcd-4923-876e-4f8e71204859/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/a3bdd97e-d1b4-438c-a8d3-af6fc7fee3d4/master/master_v1767346651002.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/dna/ref_0.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_bedroom_9x16_1768587465376.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/dna/ref_1.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_hotel_lobby_9x16_1768587325775.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_restaurant_booth_9x16_1768587098355.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_industrial_loft_4x3_1768587185606.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_cafe_wall_9x16_1768587060422.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_bedroom_9x16_1768586810707.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_bedroom_9x16_1768586431208.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_industrial_loft_9x16_1768585556878.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_leaning_floor_9x16_1768585504810.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_bedroom_9x16_1768584866962.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/mockups/mockup_living_room_9x16_1768397250605.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714853_12.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714852_11.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714854_13.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714854_14.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_11-14_4714x6000_RGB.png?t=1768602529932
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_5-7_4286x6000_RGB.png?t=1768602529932
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_2-3_4000x6000_RGB.png?t=1768602529933
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_3-4_4500x6000_RGB.png?t=1768602529933
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/variants/Galata_Tower_Oil_Painting___Old_Istanbul_Canvas_Wall_Art___Vintage_Turkish_Decor___Nostalgic_Travel_Gift_348b4058-7bed-40a3-8604-7b214f73a6fd_4-5_4800x6000_RGB.png?t=1768602529933
|
||||||
|
[INCOMING] GET /api/user/branding
|
||||||
|
[INCOMING] GET /api/user/apikey
|
||||||
|
[INCOMING] GET /api/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768599943420.png
|
||||||
|
[INCOMING] GET /api/user/branding
|
||||||
|
[INCOMING] GET /api/user/apikey
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] GET /api/user/apikey
|
||||||
|
[INCOMING] GET /api/user/branding
|
||||||
|
[INCOMING] GET /api/user/apikey
|
||||||
|
[INCOMING] GET /api/user/branding
|
||||||
|
[INCOMING] GET /api/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768599943420.png
|
||||||
|
[INCOMING] POST /api/user/logo
|
||||||
|
[INCOMING] GET /api/auth/me
|
||||||
|
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
|
||||||
|
[INCOMING] GET /api/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png
|
||||||
|
[INCOMING] POST /api/user/branding
|
||||||
|
[INCOMING] GET /api/auth/me
|
||||||
|
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
|
||||||
|
[INCOMING] GET /api/user/branding
|
||||||
|
[INCOMING] GET /api/user/apikey
|
||||||
|
[INCOMING] GET /api/user/branding
|
||||||
|
[INCOMING] GET /api/user/apikey
|
||||||
|
[INCOMING] GET /api/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] GET /api/user/apikey
|
||||||
|
[INCOMING] GET /api/user/branding
|
||||||
|
[INCOMING] GET /api/user/apikey
|
||||||
|
[INCOMING] GET /api/user/branding
|
||||||
|
[INCOMING] GET /api/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] POST /api/user/branding
|
||||||
|
[INCOMING] GET /api/auth/me
|
||||||
|
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] GET /api/user/apikey
|
||||||
|
[INCOMING] GET /api/user/branding
|
||||||
|
[INCOMING] GET /api/user/apikey
|
||||||
|
[INCOMING] GET /api/user/branding
|
||||||
|
[INCOMING] GET /api/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] GET /api/user/apikey
|
||||||
|
[INCOMING] GET /api/user/branding
|
||||||
|
[INCOMING] GET /api/user/apikey
|
||||||
|
[INCOMING] GET /api/user/branding
|
||||||
|
[INCOMING] GET /api/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] GET /api/user/apikey
|
||||||
|
[INCOMING] GET /api/user/branding
|
||||||
|
[INCOMING] GET /api/user/apikey
|
||||||
|
[INCOMING] GET /api/user/branding
|
||||||
|
[INCOMING] GET /api/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] POST /api/user/sku
|
||||||
|
[INCOMING] GET /api/projects
|
||||||
|
[API] Fetching Projects for User: admin@etsymastermind.com (ADMIN)
|
||||||
|
👀 GOD MODE: Fetching ALL projects.
|
||||||
|
[INCOMING] GET /api/projects
|
||||||
|
[API] Fetching Projects for User: admin@etsymastermind.com (ADMIN)
|
||||||
|
👀 GOD MODE: Fetching ALL projects.
|
||||||
|
[INCOMING] GET /api/profiles
|
||||||
|
[INCOMING] GET /api/profiles
|
||||||
|
[INCOMING] GET /api/auth/me
|
||||||
|
[INCOMING] GET /api/auth/me
|
||||||
|
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
|
||||||
|
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
|
||||||
|
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
|
||||||
|
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
|
||||||
|
[INCOMING] GET /storage/projects/e0f909c4-1e7f-41e7-9695-af0dd94322dd/master/master_v1768595274399.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/master/master_v1768396872284.png
|
||||||
|
[INCOMING] GET /storage/projects/5c2ef9fe-f28d-4bff-a32b-79bb491566d2/master/master_v1768591304502.png
|
||||||
|
[INCOMING] GET /storage/projects/9e552293-ef1e-4b2f-8a12-96dc85a6fcf7/master/master_v1767826257332.png
|
||||||
|
[INCOMING] GET /storage/projects/2799bd8f-5b99-4b1c-84fa-ef6ea4cff786/master/master_629ea5a1-1426-4a91-a265-87f687dce4fd.png
|
||||||
|
[INCOMING] GET /storage/projects/994be50a-c836-459b-b3f5-158cb3270280/master/master_5f901522-bfb9-42b8-8dd3-7afa126c1b35.png
|
||||||
|
[INCOMING] GET /storage/projects/bc83ac40-fdc6-4dcc-a124-20e738af29d4/master/master_fb4ab595-3696-4ce2-85b4-28b5326daa05.png
|
||||||
|
[INCOMING] GET /storage/projects/5bad9034-40cd-4841-b598-9da4acd9eb20/master/master_120dd4f4-2b55-4eb2-be66-a1ec62020d24.png
|
||||||
|
[INCOMING] GET /storage/projects/e3334dcb-0c8f-4d7c-a516-a248d617848d/master/master_f5fb0a20-9799-400c-928b-932f6917301a.png
|
||||||
|
[INCOMING] GET /storage/projects/293635b4-d9cd-45b4-8de1-b6c61ce661e6/master/master_0bcc692f-dd90-4422-80b1-9f86bb5a0fd4.png
|
||||||
|
[INCOMING] GET /storage/projects/233cc95a-2b28-4740-98cf-8701da61c1fd/master/master_8b69f670-b188-4d3d-b1ac-c62b6408062a.png
|
||||||
|
[INCOMING] GET /storage/projects/80115793-f029-42c3-8c04-fe4b76125f01/master/master_810b7550-ead6-4b5f-add7-f187a5a5ffa4.png
|
||||||
|
[INCOMING] GET /storage/projects/e857e0f1-cb9d-48ce-b790-722b87e6e19f/master/master_v1767823023819.png
|
||||||
|
[INCOMING] GET /storage/projects/b9f505f4-cda6-47d5-a8b5-0c0d1c1e51fb/master/master_v1767822876978.png
|
||||||
|
[INCOMING] GET /storage/projects/0a01c4f9-f6d3-4d6f-9338-ce924d4c6b78/master/master_v1767822818038.png
|
||||||
|
[INCOMING] GET /storage/projects/9dae9693-71a6-4112-8942-e7d7bb68a579/master/master_1767822745476.png
|
||||||
|
[INCOMING] GET /storage/projects/60b5eb1b-0daf-4010-847a-8f087c603735/master/master_879f505f-06bd-479a-9649-4f53c6ca4e5b.png
|
||||||
|
[INCOMING] GET /storage/projects/9d28f0bb-d385-49fb-9d12-dd40fae0ba3b/master/master_v1767822558275.png
|
||||||
|
[INCOMING] GET /storage/projects/8a75d03a-afe5-4615-a53e-87a04d91a5d7/master/master_568a9c4e-a252-4b10-8318-1804924e0a4f.png
|
||||||
|
[INCOMING] GET /storage/projects/2870fc6f-56c3-4a4c-9d62-23db7c34f430/master/master_49c61b35-ba1e-42d8-a527-f7eac659622b.png
|
||||||
|
[INCOMING] GET /storage/projects/22484c4f-ce6c-4c59-b944-8f4c4b202d23/master/master_699b7071-ae5a-43d2-9e75-9e3cd9c1b6cc.png
|
||||||
|
[INCOMING] GET /storage/projects/2111b50c-a901-4f7d-be83-b55489042a28/master/upscale_1767729326486.png
|
||||||
|
[INCOMING] GET /storage/projects/7c4864f6-6485-40a2-993d-e00ab78514dc/master/upscale_1767738929194.png
|
||||||
|
[INCOMING] GET /storage/projects/3c3c1ad8-45b0-4edf-8ab7-52ae2deb1cb0/master/master_v1767624479473.png
|
||||||
|
[INCOMING] GET /storage/projects/34b713eb-04fb-45fa-a7b7-71bfa6e4300e/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/80d04990-df57-4ab5-8cde-4dfc1a0c8b61/master/remix_master.png
|
||||||
|
[INCOMING] GET /storage/projects/78749e75-56fd-435f-9796-5014d06f240b/master/master_v1767529874679.png
|
||||||
|
[INCOMING] GET /storage/projects/e14b9190-fce4-4e09-a7f0-65d8d3724c63/master/remix_master.png
|
||||||
|
[INCOMING] GET /storage/projects/cf2d0883-6b35-4997-ad62-c1180346ce09/master/master_v1767500734061.png
|
||||||
|
[INCOMING] GET /storage/projects/1d740cbe-4d6b-4626-a153-5028133c63d0/master/master_v1767493046886.png
|
||||||
|
[INCOMING] GET /storage/projects/38e0398d-e3f2-44ff-9ce0-59e75f1b63a2/master/master_v1767488198215.png
|
||||||
|
[INCOMING] GET /storage/projects/b55c6395-ad20-43f6-a72c-7fdb3c876aae/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/214255f3-3f9a-4219-b0dc-791d14ef4f38/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/dfacbbbe-1d92-4e78-ad54-3ff8952dc226/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/86bf2f71-fb50-44df-bf48-e7b48372027a/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/275035ae-84e6-4a14-9ae9-1991b5570d6c/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/bb18aa00-77aa-4b62-bf6e-e897bf2ff0bb/master/master_v1767398257715.png
|
||||||
|
[INCOMING] GET /storage/projects/743a6d27-a758-4438-b6db-9ed22041681b/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/64c29417-e641-4f91-9e03-2a655f4fb2fb/master/master_v1767382999240.png
|
||||||
|
[INCOMING] GET /storage/projects/7a73f208-e2e7-4646-9cf6-b1fef204eefd/master/master_v1767376258459.png
|
||||||
|
[INCOMING] GET /storage/projects/4b9d87b5-c3f0-4451-a9dc-9816aaab2483/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/caa26e5a-c801-46f3-ab09-27b6ac65ff75/master/master_v1767374099220.png
|
||||||
|
[INCOMING] GET /storage/projects/4522fbb7-fd8f-42de-91eb-5254be2fc698/master/master_v1767372640030.png
|
||||||
|
[INCOMING] GET /storage/projects/e9f72877-5b3a-4301-9909-967652eda2a4/master/master_v1767366117095.png
|
||||||
|
[INCOMING] GET /storage/projects/2240578c-2135-4225-8f36-d77847799cd6/master/master_v1767364535111.png
|
||||||
|
[INCOMING] GET /storage/projects/6fda2920-12f9-48ca-9c9e-25909465c564/master/master_v1767361081123.png
|
||||||
|
[INCOMING] GET /storage/projects/a30c437d-20d5-42fc-93b4-87a61e72ee9f/master/master_v1767370255938.png
|
||||||
|
[INCOMING] GET /storage/projects/5890aeda-f2b4-4e0b-9ae6-ec2181858811/master/master_v1767359560657.png
|
||||||
|
[INCOMING] GET /storage/projects/e53658fd-8941-4b7f-9770-eb05acde027f/master/master_v1767352780343.png
|
||||||
|
[INCOMING] GET /storage/projects/8c89b4b1-a054-456d-bf9f-c0fb5bec7066/master/master_v1767580618901.png
|
||||||
|
[INCOMING] GET /storage/projects/3049dc9b-f5ae-4d96-a38f-2bfc2085dd48/master/master_v1767351600505.png
|
||||||
|
[INCOMING] GET /storage/projects/06dbb2a5-b7c8-49a5-8883-d6775a84f855/master/master_v1767350957171.png
|
||||||
|
[INCOMING] GET /storage/projects/85b474c4-2d84-4806-a1e3-3cc88c057b85/master/master_v1767347718634.png
|
||||||
|
[INCOMING] GET /storage/projects/75777f53-f5e3-47ea-b0e5-99f345bc2188/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/a3bdd97e-d1b4-438c-a8d3-af6fc7fee3d4/master/master_v1767346651002.png
|
||||||
|
[INCOMING] GET /storage/projects/5f2dc761-fdcd-4923-876e-4f8e71204859/master/master.png
|
||||||
|
[INCOMING] GET /api/projects
|
||||||
|
[API] Fetching Projects for User: admin@etsymastermind.com (ADMIN)
|
||||||
|
👀 GOD MODE: Fetching ALL projects.
|
||||||
|
[INCOMING] GET /api/projects
|
||||||
|
[API] Fetching Projects for User: admin@etsymastermind.com (ADMIN)
|
||||||
|
👀 GOD MODE: Fetching ALL projects.
|
||||||
|
[INCOMING] GET /api/auth/me
|
||||||
|
[INCOMING] GET /api/profiles
|
||||||
|
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
|
||||||
|
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
|
||||||
|
[INCOMING] GET /api/profiles
|
||||||
|
[INCOMING] GET /api/auth/me
|
||||||
|
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
|
||||||
|
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
|
||||||
|
[INCOMING] GET /storage/projects/2799bd8f-5b99-4b1c-84fa-ef6ea4cff786/master/master_629ea5a1-1426-4a91-a265-87f687dce4fd.png
|
||||||
|
[INCOMING] GET /storage/projects/e0f909c4-1e7f-41e7-9695-af0dd94322dd/master/master_v1768595274399.png
|
||||||
|
[INCOMING] GET /storage/projects/994be50a-c836-459b-b3f5-158cb3270280/master/master_5f901522-bfb9-42b8-8dd3-7afa126c1b35.png
|
||||||
|
[INCOMING] GET /storage/projects/5c2ef9fe-f28d-4bff-a32b-79bb491566d2/master/master_v1768591304502.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/master/master_v1768396872284.png
|
||||||
|
[INCOMING] GET /storage/projects/9e552293-ef1e-4b2f-8a12-96dc85a6fcf7/master/master_v1767826257332.png
|
||||||
|
[INCOMING] GET /storage/projects/bc83ac40-fdc6-4dcc-a124-20e738af29d4/master/master_fb4ab595-3696-4ce2-85b4-28b5326daa05.png
|
||||||
|
[INCOMING] GET /storage/projects/5bad9034-40cd-4841-b598-9da4acd9eb20/master/master_120dd4f4-2b55-4eb2-be66-a1ec62020d24.png
|
||||||
|
[INCOMING] GET /storage/projects/e3334dcb-0c8f-4d7c-a516-a248d617848d/master/master_f5fb0a20-9799-400c-928b-932f6917301a.png
|
||||||
|
[INCOMING] GET /storage/projects/293635b4-d9cd-45b4-8de1-b6c61ce661e6/master/master_0bcc692f-dd90-4422-80b1-9f86bb5a0fd4.png
|
||||||
|
[INCOMING] GET /storage/projects/233cc95a-2b28-4740-98cf-8701da61c1fd/master/master_8b69f670-b188-4d3d-b1ac-c62b6408062a.png
|
||||||
|
[INCOMING] GET /storage/projects/80115793-f029-42c3-8c04-fe4b76125f01/master/master_810b7550-ead6-4b5f-add7-f187a5a5ffa4.png
|
||||||
|
[INCOMING] GET /storage/projects/e857e0f1-cb9d-48ce-b790-722b87e6e19f/master/master_v1767823023819.png
|
||||||
|
[INCOMING] GET /storage/projects/b9f505f4-cda6-47d5-a8b5-0c0d1c1e51fb/master/master_v1767822876978.png
|
||||||
|
[INCOMING] GET /storage/projects/0a01c4f9-f6d3-4d6f-9338-ce924d4c6b78/master/master_v1767822818038.png
|
||||||
|
[INCOMING] GET /storage/projects/9dae9693-71a6-4112-8942-e7d7bb68a579/master/master_1767822745476.png
|
||||||
|
[INCOMING] GET /storage/projects/60b5eb1b-0daf-4010-847a-8f087c603735/master/master_879f505f-06bd-479a-9649-4f53c6ca4e5b.png
|
||||||
|
[INCOMING] GET /storage/projects/9d28f0bb-d385-49fb-9d12-dd40fae0ba3b/master/master_v1767822558275.png
|
||||||
|
[INCOMING] GET /storage/projects/8a75d03a-afe5-4615-a53e-87a04d91a5d7/master/master_568a9c4e-a252-4b10-8318-1804924e0a4f.png
|
||||||
|
[INCOMING] GET /storage/projects/2870fc6f-56c3-4a4c-9d62-23db7c34f430/master/master_49c61b35-ba1e-42d8-a527-f7eac659622b.png
|
||||||
|
[INCOMING] GET /storage/projects/22484c4f-ce6c-4c59-b944-8f4c4b202d23/master/master_699b7071-ae5a-43d2-9e75-9e3cd9c1b6cc.png
|
||||||
|
[INCOMING] GET /storage/projects/2111b50c-a901-4f7d-be83-b55489042a28/master/upscale_1767729326486.png
|
||||||
|
[INCOMING] GET /storage/projects/7c4864f6-6485-40a2-993d-e00ab78514dc/master/upscale_1767738929194.png
|
||||||
|
[INCOMING] GET /storage/projects/34b713eb-04fb-45fa-a7b7-71bfa6e4300e/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/3c3c1ad8-45b0-4edf-8ab7-52ae2deb1cb0/master/master_v1767624479473.png
|
||||||
|
[INCOMING] GET /storage/projects/80d04990-df57-4ab5-8cde-4dfc1a0c8b61/master/remix_master.png
|
||||||
|
[INCOMING] GET /storage/projects/78749e75-56fd-435f-9796-5014d06f240b/master/master_v1767529874679.png
|
||||||
|
[INCOMING] GET /storage/projects/e14b9190-fce4-4e09-a7f0-65d8d3724c63/master/remix_master.png
|
||||||
|
[INCOMING] GET /storage/projects/cf2d0883-6b35-4997-ad62-c1180346ce09/master/master_v1767500734061.png
|
||||||
|
[INCOMING] GET /storage/projects/1d740cbe-4d6b-4626-a153-5028133c63d0/master/master_v1767493046886.png
|
||||||
|
[INCOMING] GET /storage/projects/38e0398d-e3f2-44ff-9ce0-59e75f1b63a2/master/master_v1767488198215.png
|
||||||
|
[INCOMING] GET /storage/projects/b55c6395-ad20-43f6-a72c-7fdb3c876aae/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/214255f3-3f9a-4219-b0dc-791d14ef4f38/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/dfacbbbe-1d92-4e78-ad54-3ff8952dc226/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/86bf2f71-fb50-44df-bf48-e7b48372027a/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/275035ae-84e6-4a14-9ae9-1991b5570d6c/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/bb18aa00-77aa-4b62-bf6e-e897bf2ff0bb/master/master_v1767398257715.png
|
||||||
|
[INCOMING] GET /storage/projects/743a6d27-a758-4438-b6db-9ed22041681b/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/64c29417-e641-4f91-9e03-2a655f4fb2fb/master/master_v1767382999240.png
|
||||||
|
[INCOMING] GET /storage/projects/7a73f208-e2e7-4646-9cf6-b1fef204eefd/master/master_v1767376258459.png
|
||||||
|
[INCOMING] GET /storage/projects/4b9d87b5-c3f0-4451-a9dc-9816aaab2483/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/caa26e5a-c801-46f3-ab09-27b6ac65ff75/master/master_v1767374099220.png
|
||||||
|
[INCOMING] GET /storage/projects/4522fbb7-fd8f-42de-91eb-5254be2fc698/master/master_v1767372640030.png
|
||||||
|
[INCOMING] GET /storage/projects/a30c437d-20d5-42fc-93b4-87a61e72ee9f/master/master_v1767370255938.png
|
||||||
|
[INCOMING] GET /storage/projects/e9f72877-5b3a-4301-9909-967652eda2a4/master/master_v1767366117095.png
|
||||||
|
[INCOMING] GET /storage/projects/2240578c-2135-4225-8f36-d77847799cd6/master/master_v1767364535111.png
|
||||||
|
[INCOMING] GET /storage/projects/6fda2920-12f9-48ca-9c9e-25909465c564/master/master_v1767361081123.png
|
||||||
|
[INCOMING] GET /storage/projects/5890aeda-f2b4-4e0b-9ae6-ec2181858811/master/master_v1767359560657.png
|
||||||
|
[INCOMING] GET /storage/projects/e53658fd-8941-4b7f-9770-eb05acde027f/master/master_v1767352780343.png
|
||||||
|
[INCOMING] GET /storage/projects/8c89b4b1-a054-456d-bf9f-c0fb5bec7066/master/master_v1767580618901.png
|
||||||
|
[INCOMING] GET /storage/projects/3049dc9b-f5ae-4d96-a38f-2bfc2085dd48/master/master_v1767351600505.png
|
||||||
|
[INCOMING] GET /storage/projects/06dbb2a5-b7c8-49a5-8883-d6775a84f855/master/master_v1767350957171.png
|
||||||
|
[INCOMING] GET /storage/projects/85b474c4-2d84-4806-a1e3-3cc88c057b85/master/master_v1767347718634.png
|
||||||
|
[INCOMING] GET /storage/projects/75777f53-f5e3-47ea-b0e5-99f345bc2188/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/a3bdd97e-d1b4-438c-a8d3-af6fc7fee3d4/master/master_v1767346651002.png
|
||||||
|
[INCOMING] GET /storage/projects/5f2dc761-fdcd-4923-876e-4f8e71204859/master/master.png
|
||||||
|
[INCOMING] GET /api/projects
|
||||||
|
[API] Fetching Projects for User: admin@etsymastermind.com (ADMIN)
|
||||||
|
👀 GOD MODE: Fetching ALL projects.
|
||||||
|
[INCOMING] GET /api/projects
|
||||||
|
[API] Fetching Projects for User: admin@etsymastermind.com (ADMIN)
|
||||||
|
👀 GOD MODE: Fetching ALL projects.
|
||||||
|
[INCOMING] GET /api/profiles
|
||||||
|
[INCOMING] GET /api/auth/me
|
||||||
|
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
|
||||||
|
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
|
||||||
|
[INCOMING] GET /api/profiles
|
||||||
|
[INCOMING] GET /api/auth/me
|
||||||
|
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
|
||||||
|
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
|
||||||
|
[INCOMING] GET /storage/projects/2799bd8f-5b99-4b1c-84fa-ef6ea4cff786/master/master_629ea5a1-1426-4a91-a265-87f687dce4fd.png
|
||||||
|
[INCOMING] GET /storage/projects/994be50a-c836-459b-b3f5-158cb3270280/master/master_5f901522-bfb9-42b8-8dd3-7afa126c1b35.png
|
||||||
|
[INCOMING] GET /storage/projects/e0f909c4-1e7f-41e7-9695-af0dd94322dd/master/master_v1768595274399.png
|
||||||
|
[INCOMING] GET /storage/projects/348b4058-7bed-40a3-8604-7b214f73a6fd/master/master_v1768396872284.png
|
||||||
|
[INCOMING] GET /storage/projects/5c2ef9fe-f28d-4bff-a32b-79bb491566d2/master/master_v1768591304502.png
|
||||||
|
[INCOMING] GET /storage/projects/9e552293-ef1e-4b2f-8a12-96dc85a6fcf7/master/master_v1767826257332.png
|
||||||
|
[INCOMING] GET /storage/projects/bc83ac40-fdc6-4dcc-a124-20e738af29d4/master/master_fb4ab595-3696-4ce2-85b4-28b5326daa05.png
|
||||||
|
[INCOMING] GET /storage/projects/5bad9034-40cd-4841-b598-9da4acd9eb20/master/master_120dd4f4-2b55-4eb2-be66-a1ec62020d24.png
|
||||||
|
[INCOMING] GET /storage/projects/293635b4-d9cd-45b4-8de1-b6c61ce661e6/master/master_0bcc692f-dd90-4422-80b1-9f86bb5a0fd4.png
|
||||||
|
[INCOMING] GET /storage/projects/e3334dcb-0c8f-4d7c-a516-a248d617848d/master/master_f5fb0a20-9799-400c-928b-932f6917301a.png
|
||||||
|
[INCOMING] GET /storage/projects/233cc95a-2b28-4740-98cf-8701da61c1fd/master/master_8b69f670-b188-4d3d-b1ac-c62b6408062a.png
|
||||||
|
[INCOMING] GET /storage/projects/80115793-f029-42c3-8c04-fe4b76125f01/master/master_810b7550-ead6-4b5f-add7-f187a5a5ffa4.png
|
||||||
|
[INCOMING] GET /storage/projects/e857e0f1-cb9d-48ce-b790-722b87e6e19f/master/master_v1767823023819.png
|
||||||
|
[INCOMING] GET /storage/projects/b9f505f4-cda6-47d5-a8b5-0c0d1c1e51fb/master/master_v1767822876978.png
|
||||||
|
[INCOMING] GET /storage/projects/0a01c4f9-f6d3-4d6f-9338-ce924d4c6b78/master/master_v1767822818038.png
|
||||||
|
[INCOMING] GET /storage/projects/9dae9693-71a6-4112-8942-e7d7bb68a579/master/master_1767822745476.png
|
||||||
|
[INCOMING] GET /storage/projects/60b5eb1b-0daf-4010-847a-8f087c603735/master/master_879f505f-06bd-479a-9649-4f53c6ca4e5b.png
|
||||||
|
[INCOMING] GET /storage/projects/9d28f0bb-d385-49fb-9d12-dd40fae0ba3b/master/master_v1767822558275.png
|
||||||
|
[INCOMING] GET /storage/projects/8a75d03a-afe5-4615-a53e-87a04d91a5d7/master/master_568a9c4e-a252-4b10-8318-1804924e0a4f.png
|
||||||
|
[INCOMING] GET /storage/projects/2870fc6f-56c3-4a4c-9d62-23db7c34f430/master/master_49c61b35-ba1e-42d8-a527-f7eac659622b.png
|
||||||
|
[INCOMING] GET /storage/projects/22484c4f-ce6c-4c59-b944-8f4c4b202d23/master/master_699b7071-ae5a-43d2-9e75-9e3cd9c1b6cc.png
|
||||||
|
[INCOMING] GET /storage/projects/2111b50c-a901-4f7d-be83-b55489042a28/master/upscale_1767729326486.png
|
||||||
|
[INCOMING] GET /storage/projects/7c4864f6-6485-40a2-993d-e00ab78514dc/master/upscale_1767738929194.png
|
||||||
|
[INCOMING] GET /storage/projects/3c3c1ad8-45b0-4edf-8ab7-52ae2deb1cb0/master/master_v1767624479473.png
|
||||||
|
[INCOMING] GET /storage/projects/80d04990-df57-4ab5-8cde-4dfc1a0c8b61/master/remix_master.png
|
||||||
|
[INCOMING] GET /storage/projects/34b713eb-04fb-45fa-a7b7-71bfa6e4300e/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/78749e75-56fd-435f-9796-5014d06f240b/master/master_v1767529874679.png
|
||||||
|
[INCOMING] GET /storage/projects/e14b9190-fce4-4e09-a7f0-65d8d3724c63/master/remix_master.png
|
||||||
|
[INCOMING] GET /storage/projects/cf2d0883-6b35-4997-ad62-c1180346ce09/master/master_v1767500734061.png
|
||||||
|
[INCOMING] GET /storage/projects/b55c6395-ad20-43f6-a72c-7fdb3c876aae/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/1d740cbe-4d6b-4626-a153-5028133c63d0/master/master_v1767493046886.png
|
||||||
|
[INCOMING] GET /storage/projects/214255f3-3f9a-4219-b0dc-791d14ef4f38/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/38e0398d-e3f2-44ff-9ce0-59e75f1b63a2/master/master_v1767488198215.png
|
||||||
|
[INCOMING] GET /storage/projects/dfacbbbe-1d92-4e78-ad54-3ff8952dc226/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/86bf2f71-fb50-44df-bf48-e7b48372027a/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/275035ae-84e6-4a14-9ae9-1991b5570d6c/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/bb18aa00-77aa-4b62-bf6e-e897bf2ff0bb/master/master_v1767398257715.png
|
||||||
|
[INCOMING] GET /storage/projects/743a6d27-a758-4438-b6db-9ed22041681b/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/64c29417-e641-4f91-9e03-2a655f4fb2fb/master/master_v1767382999240.png
|
||||||
|
[INCOMING] GET /storage/projects/7a73f208-e2e7-4646-9cf6-b1fef204eefd/master/master_v1767376258459.png
|
||||||
|
[INCOMING] GET /storage/projects/4b9d87b5-c3f0-4451-a9dc-9816aaab2483/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/caa26e5a-c801-46f3-ab09-27b6ac65ff75/master/master_v1767374099220.png
|
||||||
|
[INCOMING] GET /storage/projects/4522fbb7-fd8f-42de-91eb-5254be2fc698/master/master_v1767372640030.png
|
||||||
|
[INCOMING] GET /storage/projects/a30c437d-20d5-42fc-93b4-87a61e72ee9f/master/master_v1767370255938.png
|
||||||
|
[INCOMING] GET /storage/projects/e9f72877-5b3a-4301-9909-967652eda2a4/master/master_v1767366117095.png
|
||||||
|
[INCOMING] GET /storage/projects/2240578c-2135-4225-8f36-d77847799cd6/master/master_v1767364535111.png
|
||||||
|
[INCOMING] GET /storage/projects/6fda2920-12f9-48ca-9c9e-25909465c564/master/master_v1767361081123.png
|
||||||
|
[INCOMING] GET /storage/projects/5890aeda-f2b4-4e0b-9ae6-ec2181858811/master/master_v1767359560657.png
|
||||||
|
[INCOMING] GET /storage/projects/e53658fd-8941-4b7f-9770-eb05acde027f/master/master_v1767352780343.png
|
||||||
|
[INCOMING] GET /storage/projects/8c89b4b1-a054-456d-bf9f-c0fb5bec7066/master/master_v1767580618901.png
|
||||||
|
[INCOMING] GET /storage/projects/3049dc9b-f5ae-4d96-a38f-2bfc2085dd48/master/master_v1767351600505.png
|
||||||
|
[INCOMING] GET /storage/projects/06dbb2a5-b7c8-49a5-8883-d6775a84f855/master/master_v1767350957171.png
|
||||||
|
[INCOMING] GET /storage/projects/85b474c4-2d84-4806-a1e3-3cc88c057b85/master/master_v1767347718634.png
|
||||||
|
[INCOMING] GET /storage/projects/75777f53-f5e3-47ea-b0e5-99f345bc2188/master/master.png
|
||||||
|
[INCOMING] GET /storage/projects/a3bdd97e-d1b4-438c-a8d3-af6fc7fee3d4/master/master_v1767346651002.png
|
||||||
|
[INCOMING] GET /storage/projects/5f2dc761-fdcd-4923-876e-4f8e71204859/master/master.png
|
||||||
|
[INCOMING] GET /api/projects/354c33a7-5ea8-49c5-8535-95f19429b65b
|
||||||
|
[INCOMING] GET /api/profiles/915d8998-6524-4b8f-b42e-00ccee3c0600
|
||||||
|
[INCOMING] GET /storage/projects/354c33a7-5ea8-49c5-8535-95f19429b65b/dna/ref_0.png
|
||||||
|
[INCOMING] GET /storage/projects/354c33a7-5ea8-49c5-8535-95f19429b65b/dna/ref_4.png
|
||||||
|
[INCOMING] GET /storage/projects/354c33a7-5ea8-49c5-8535-95f19429b65b/dna/ref_1.png
|
||||||
|
[INCOMING] GET /storage/projects/354c33a7-5ea8-49c5-8535-95f19429b65b/dna/ref_6.png
|
||||||
|
[INCOMING] GET /storage/projects/354c33a7-5ea8-49c5-8535-95f19429b65b/dna/ref_2.png
|
||||||
|
[INCOMING] GET /storage/projects/354c33a7-5ea8-49c5-8535-95f19429b65b/dna/ref_3.png
|
||||||
|
[INCOMING] GET /storage/projects/354c33a7-5ea8-49c5-8535-95f19429b65b/dna/ref_5.png
|
||||||
|
[INCOMING] GET /storage/projects/354c33a7-5ea8-49c5-8535-95f19429b65b/dna/ref_7.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046088_1.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046092_3.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046090_2.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046085_0.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046095_5.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046094_4.png
|
||||||
|
[INCOMING] GET /api/profiles
|
||||||
|
[INCOMING] GET /api/auth/me
|
||||||
|
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046097_6.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046098_7.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714846_8.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714848_9.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714850_10.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714852_11.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714853_12.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714854_13.png
|
||||||
|
[INCOMING] GET /storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714854_14.png
|
||||||
|
[INCOMING] POST /api/projects
|
||||||
|
[API] Create Project Request by admin@etsymastermind.com: güzel bir kadın derin dekolteli gece elbisesi ile partide çok eğleniyor. black and white, retro, film noir, photography art, nude art, Wall Art (ExactRef: false) (HasKey: false)
|
||||||
|
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046085_0.png
|
||||||
|
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046088_1.png
|
||||||
|
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046090_2.png
|
||||||
|
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046092_3.png
|
||||||
|
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046094_4.png
|
||||||
|
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046095_5.png
|
||||||
|
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046097_6.png
|
||||||
|
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1767828046098_7.png
|
||||||
|
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714846_8.png
|
||||||
|
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714848_9.png
|
||||||
|
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714850_10.png
|
||||||
|
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714852_11.png
|
||||||
|
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714853_12.png
|
||||||
|
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714854_13.png
|
||||||
|
[API] Resolving existing reference asset: /Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/projects/global_dna/915d8998-6524-4b8f-b42e-00ccee3c0600/ref_1768593714854_14.png
|
||||||
|
[UsageService] ⚡ GOD MODE: User is ADMIN, bypassing credit deduction.
|
||||||
|
[API] Creating DB record...
|
||||||
|
[API] Project created: f4a396f1-0bed-4d07-ab0e-8f9bb6a6bb88
|
||||||
|
[API] Step 0: Conducting Market Research...
|
||||||
|
[API] Market Intelligence Acquired: [
|
||||||
|
'Old Hollywood Glamour',
|
||||||
|
'Eclectic Maximalism',
|
||||||
|
'Flash Photography / Paparazzi Aesthetic',
|
||||||
|
'Bar Cart Art',
|
||||||
|
'Moody Dark Academia'
|
||||||
|
]
|
||||||
|
[API] Step 1: Generating Art Direction...
|
||||||
|
[API] Step 2: Generating SEO Strategy...
|
||||||
|
[DEBUG] SEO Response Text: {
|
||||||
|
"seoTitle": "Black and White Fashion Print | Retro Woman Drinking Champagne Art | Sexy Bar Cart Decor | Vintage Bathroom Poster | Party Girl Gift",
|
||||||
|
"keywords": [
|
||||||
|
"Bar Cart Art",
|
||||||
|
"Black and White Art",
|
||||||
|
"Vintage Fashion",
|
||||||
|
"Sexy Wall Decor",
|
||||||
|
"Champagne Print",
|
||||||
|
"Retro Party Poster",
|
||||||
|
"Bathroom Wall Art",
|
||||||
|
"Flash Photography",
|
||||||
|
"Old Money Aesthetic",
|
||||||
|
"Eclectic Home Decor",
|
||||||
|
"Woman Drinking Art",
|
||||||
|
"Preppy Room Decor",
|
||||||
|
"Fashion Photography"
|
||||||
|
],
|
||||||
|
"description": "Capture the unbridled euphoria of an endless night with this high-fashion masterpiece. This art print embodies the 'Drunken Elegance' aesthetic—perfect for adding a touch of rebellious glamour to your space.\n\nWhy this piece belongs on your wall:\n• \u2728 **Timeless Energy:** A stunning candid moment of pure joy, frozen in high-contrast vintage flash photography style.\n• \u2728 **Tasteful Risqué:** The daring deep-v satin gown offers a sophisticated 'Vogue' appeal that is sexy yet classy enough for the living room.\n• \u2728 **Modern Resolution:** Unlike gritty thrift store finds, this piece offers 8K clarity while maintaining authentic film grain texture.\n• \u2728 **Versatile Decor:** The ultimate cheeky addition to a bar cart, powder room, or eclectic gallery wall.\n\nBring the Great Gatsby energy to your Friday night. \n\n**Order now to make your walls the life of the party.**",
|
||||||
|
"suggestedPrice": "28.00",
|
||||||
|
"jsonLd": {
|
||||||
|
"@context": "https://schema.org/",
|
||||||
|
"@type": "Product",
|
||||||
|
"name": "Black and White Fashion Print | Retro Woman Drinking Champagne Art",
|
||||||
|
"description": "High-fashion black and white wall art featuring a retro woman laughing with champagne. Vintage flash photography aesthetic perfect for bar carts and bathrooms."
|
||||||
|
},
|
||||||
|
"categorySuggestion": "Art & Collectibles > Prints > Digital Prints",
|
||||||
|
"attributes": {
|
||||||
|
"date": "1990s",
|
||||||
|
"occasion": "Housewarming",
|
||||||
|
"primaryColor": "Black",
|
||||||
|
"room": "Kitchen & Dining",
|
||||||
|
"secondaryColor": "White"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[API] Saved Printing Guide: projects/f4a396f1-0bed-4d07-ab0e-8f9bb6a6bb88/docs/Printing_Guide.txt
|
||||||
|
[SANITIZE] Prompt appears safe, no transformation needed.
|
||||||
|
[API] Calling Gemini for Image (90s Timeout)...
|
||||||
|
[API] Invoking imageGenAI.models.generateContent with gemini-3-pro-image-preview... (Ratio: 9:16)
|
||||||
|
[INCOMING] GET /api/ping-sku
|
||||||
|
[INCOMING] GET /api/ping-sku
|
||||||
|
[API] Image generation complete. Processing response...
|
||||||
|
[RATIO CHECK] Generated: 768x1376 (Ratio: 0.558)
|
||||||
|
[RATIO CHECK] Expected: 3375x6000 (Ratio: 0.563)
|
||||||
|
[PRINT-READY] Enforcing exact aspect ratio 9:16 -> 3375x6000
|
||||||
|
[PRINT-READY] Original: 768x1376 -> Target: 3375x6000 @ 300 DPI
|
||||||
|
[PRINT-READY] Final output: 3375x6000 @ 300 DPI
|
||||||
|
[INCOMING] GET /api/auth/me
|
||||||
|
[AUTH/ME] Logo check: DB value="logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", path="/Users/haruncan/Downloads/DEV/etsy-mastermind-engine-v13.1/storage/logos/logo-0262e646-5ca9-4f98-8ec0-266b496dc9ca-1768602806577.png", exists=true
|
||||||
|
[INCOMING] GET /storage/projects/f4a396f1-0bed-4d07-ab0e-8f9bb6a6bb88/master/master_78f4a903-03ab-47bc-97fe-43d0375a17ef.png
|
||||||
Reference in New Issue
Block a user