Skip to content

Commit 59f86b0

Browse files
author
pengyu
committed
clear chinese comment and update model
1 parent 3961c14 commit 59f86b0

File tree

21 files changed

+250
-113
lines changed

21 files changed

+250
-113
lines changed

backend/src/build-system/__tests__/test.frontend-code-generate.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ describe('FrontendCodeHandler', () => {
1212
name: 'Spotify-like Music Web',
1313
description: 'Users can play music',
1414
databaseType: 'SQLite',
15-
model: 'o3-mini-high',
15+
model: 'o4-mini',
1616
nodes: [
1717
{
1818
handler: FrontendCodeHandler,

backend/src/build-system/context.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ export class BuilderContext {
115115
this.globalContext.set('projectSize', 'small');
116116
break;
117117
case 'gpt-4o':
118-
case 'o3-mini-high':
118+
case 'o4-mini':
119119
this.globalContext.set('projectSize', 'medium');
120120
break;
121121
default:

backend/src/build-system/handlers/frontend-code-generate/CodeReview.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ export class FrontendQueueProcessor {
198198
let fixResponse = await chatSyncWithClocker(
199199
this.context,
200200
{
201-
model: 'o3-mini-high',
201+
model: 'o4-mini',
202202
messages: [
203203
{ role: 'system', content: fixPrompt },
204204
{
@@ -270,7 +270,7 @@ export class FrontendQueueProcessor {
270270
fixResponse = await chatSyncWithClocker(
271271
this.context,
272272
{
273-
model: 'o3-mini-high',
273+
model: 'o4-mini',
274274
messages: [
275275
{ role: 'system', content: fixPrompt },
276276
{

backend/src/build-system/handlers/frontend-code-generate/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,8 +366,8 @@ export class FrontendCodeHandler implements BuildHandler<string> {
366366
context,
367367
{
368368
model: isSPAFlag
369-
? 'claude-3.7-sonnet' // Use Claude for SPAs
370-
: 'o3-mini-high', // Use default or fallback for non-SPAs
369+
? 'gpt-4o-mini' // Use Claude for SPAs
370+
: 'o4-mini', // Use default or fallback for non-SPAs
371371
messages,
372372
},
373373
'generate frontend code',

backend/src/build-system/handlers/ux/uiux-layout/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export class UIUXLayoutHandler implements BuildHandler<string> {
7575
context,
7676
{
7777
// model: context.defaultModel || 'gpt-4o-mini',
78-
model: 'claude-3.7-sonnet',
78+
model: 'gpt-4o-mini',
7979
messages,
8080
},
8181
'generateUIUXLayout',

backend/src/user/user.model.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export class User extends SystemBaseModel {
2525
googleId: string;
2626

2727
@Field()
28-
@Column()
28+
@Column({ unique: true })
2929
username: string;
3030

3131
@Column({ nullable: true }) // Made nullable for OAuth users

backend/src/user/user.service.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {
22
BadRequestException,
3+
ConflictException,
34
Injectable,
45
NotFoundException,
56
} from '@nestjs/common';
@@ -107,4 +108,69 @@ export class UserService {
107108

108109
return true;
109110
}
111+
112+
/**
113+
* Checks if a username already exists in the database
114+
* @param username Username to check
115+
* @param excludeUserId Optional user ID to exclude from the check (for updates)
116+
* @returns Boolean indicating if the username exists
117+
*/
118+
async isUsernameExists(
119+
username: string,
120+
excludeUserId?: string,
121+
): Promise<boolean> {
122+
const query = this.userRepository
123+
.createQueryBuilder('user')
124+
.where('LOWER(user.username) = LOWER(:username)', {
125+
username: username.toLowerCase(),
126+
});
127+
128+
if (excludeUserId) {
129+
query.andWhere('user.id != :userId', { userId: excludeUserId });
130+
}
131+
132+
const count = await query.getCount();
133+
return count > 0;
134+
}
135+
136+
/**
137+
* Updates a user's username with uniqueness validation
138+
* @param userId User ID
139+
* @param newUsername New username to set
140+
* @returns Updated user object
141+
*/
142+
async updateUsername(userId: string, newUsername: string): Promise<User> {
143+
if (!newUsername || newUsername.trim().length < 3) {
144+
throw new BadRequestException(
145+
'Username must be at least 3 characters long',
146+
);
147+
}
148+
149+
// Check if the username is already taken
150+
const exists = await this.isUsernameExists(newUsername, userId);
151+
if (exists) {
152+
throw new ConflictException(
153+
`Username '${newUsername}' is already taken. Please choose another one.`,
154+
);
155+
}
156+
157+
const user = await this.userRepository.findOneBy({ id: userId });
158+
if (!user) {
159+
throw new NotFoundException('User not found');
160+
}
161+
162+
user.username = newUsername;
163+
164+
try {
165+
return await this.userRepository.save(user);
166+
} catch (error) {
167+
// Check for unique constraint error (just in case of race condition)
168+
if (error.code === '23505' || error.message.includes('duplicate')) {
169+
throw new ConflictException(
170+
`Username '${newUsername}' is already taken. Please choose another one.`,
171+
);
172+
}
173+
throw error;
174+
}
175+
}
110176
}

frontend/src/app/api/screenshot/route.ts

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,23 @@ export async function GET(req: Request) {
3333
);
3434
}
3535

36-
logger.info(`Starting screenshot for URL: ${url}`);
36+
logger.info(`[SCREENSHOT] Starting screenshot for URL: ${url}`);
3737

3838
try {
3939
// Get browser instance
40+
logger.info(`[SCREENSHOT] Attempting to get browser instance`);
4041
const browser = await getBrowser();
41-
logger.info('Browser instance acquired');
42+
logger.info(`[SCREENSHOT] Browser instance acquired successfully`);
4243

4344
// Create a new page
45+
logger.info(`[SCREENSHOT] Creating new page`);
4446
page = await browser.newPage();
45-
logger.info('New page created');
47+
logger.info(`[SCREENSHOT] New page created successfully`);
4648

4749
// Set viewport
50+
logger.info(`[SCREENSHOT] Setting viewport`);
4851
await page.setViewport({ width: 1600, height: 900 });
49-
logger.info('Viewport set to 1600x900');
52+
logger.info(`[SCREENSHOT] Viewport set successfully`);
5053

5154
// Navigate to URL with increased timeout and more reliable wait condition
5255
await page.goto(url, {
@@ -73,31 +76,40 @@ export async function GET(req: Request) {
7376
}
7477

7578
// Take screenshot
79+
logger.info(`[SCREENSHOT] Taking screenshot`);
7680
const screenshot = await page.screenshot({
7781
type: 'png',
7882
fullPage: true,
7983
});
80-
logger.info('Screenshot captured');
84+
logger.info(`[SCREENSHOT] Screenshot captured successfully, size: ${screenshot.length} bytes`);
8185

8286
// Clean up
83-
if (page) await page.close();
84-
logger.info('Page closed');
87+
if (page) {
88+
logger.info(`[SCREENSHOT] Closing page`);
89+
await page.close();
90+
logger.info(`[SCREENSHOT] Page closed successfully`);
91+
}
8592

93+
logger.info(`[SCREENSHOT] Returning screenshot response`);
8694
return new Response(screenshot, {
8795
headers: {
8896
'Content-Type': 'image/png',
89-
'Cache-Control': 's-maxage=3600',
97+
'Cache-Control': 'no-cache, no-store, must-revalidate',
98+
'Pragma': 'no-cache',
99+
'Expires': '0'
90100
},
91101
});
92102
} catch (error: any) {
93-
logger.error('Screenshot error:', error);
103+
logger.error(`[SCREENSHOT] Error capturing screenshot: ${error.message}`, error);
104+
logger.error(`[SCREENSHOT] Error stack: ${error.stack}`);
94105

95106
if (page) {
96107
try {
108+
logger.info(`[SCREENSHOT] Attempting to close page after error`);
97109
await page.close();
98-
logger.info('Closed page after error');
110+
logger.info(`[SCREENSHOT] Successfully closed page after error`);
99111
} catch (closeError) {
100-
logger.error('Error closing page:', closeError);
112+
logger.error(`[SCREENSHOT] Error closing page: ${closeError.message}`);
101113
}
102114
}
103115

@@ -108,12 +120,13 @@ export async function GET(req: Request) {
108120
) {
109121
try {
110122
if (browserInstance) {
123+
logger.warn(`[SCREENSHOT] Resetting browser instance due to protocol error`);
111124
await browserInstance.close();
112-
logger.warn('Browser instance was closed due to protocol error');
113125
browserInstance = null;
126+
logger.warn(`[SCREENSHOT] Browser instance reset successfully`);
114127
}
115128
} catch (closeBrowserError) {
116-
logger.error('Error closing browser:', closeBrowserError);
129+
logger.error(`[SCREENSHOT] Error closing browser: ${closeBrowserError.message}`);
117130
}
118131
}
119132

frontend/src/app/globals.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
height: 1px;
8383
}
8484

85-
/* 修改滚动条颜色为主题色调 */
85+
/* Modify scrollbar color to match theme */
8686
:root {
8787
--scrollbar-thumb-color: rgba(
8888
99,

frontend/src/app/media/[...path]/route.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import path from 'path';
44
import { getMediaDir } from 'codefox-common';
55
import { logger } from '@/app/log/logger';
66

7-
87
export async function GET(
98
request: NextRequest,
109
{ params }: { params: { path: string[] } }
@@ -15,7 +14,7 @@ export async function GET(
1514
const filePath = path.join(mediaDir, ...params.path);
1615
const normalizedPath = path.normalize(filePath);
1716
logger.info(`📁 getMediaDir = ${mediaDir}`);
18-
logger.info(`📂 full filePath = ${filePath}`);
17+
logger.info(`📂 full filePath = ${filePath}`);
1918
logger.debug(`Requested path: ${params.path.join('/')}`);
2019
logger.debug(`Full resolved path: ${filePath}`);
2120

0 commit comments

Comments
 (0)