10 | {content} 11 |
12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /backend/proxy-server/src/domain/entity/project.entity.ts: -------------------------------------------------------------------------------- 1 | import type { ProjectRow } from 'database/query/project.repository.mysql'; 2 | 3 | type Project = ProjectRow; 4 | 5 | export class ProjectEntity { 6 | readonly ip: string; 7 | 8 | constructor(project: Project) { 9 | this.ip = project.ip; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /frontend/src/component/atom/ValidIcon.tsx: -------------------------------------------------------------------------------- 1 | type Props = { 2 | type: 'success' | 'fail'; 3 | }; 4 | 5 | export default function Icon({ type = 'fail' }: Props) { 6 | return ( 7 | 8 | {type === 'success' ? '✓' : '✕'} 9 | 10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /backend/console-server/nest-cli.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/nest-cli", 3 | "collection": "@nestjs/schematics", 4 | "sourceRoot": "src", 5 | "compilerOptions": { 6 | "deleteOutDir": true, 7 | "assets": [ 8 | { 9 | "include": "mail/templates/**/*" 10 | } 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /backend/console-server/src/log/traffic/metric/traffic-rank.metric.ts: -------------------------------------------------------------------------------- 1 | import { IsNumber, IsString } from 'class-validator'; 2 | import { Type } from 'class-transformer'; 3 | 4 | export class TrafficRankMetric { 5 | @IsString() 6 | host: string; 7 | 8 | @Type(() => Number) 9 | @IsNumber() 10 | count: number; 11 | } 12 | -------------------------------------------------------------------------------- /backend/console-server/src/project/dto/create-project-response.dto.ts: -------------------------------------------------------------------------------- 1 | import { Exclude, Expose } from 'class-transformer'; 2 | import { ApiProperty } from '@nestjs/swagger'; 3 | 4 | @Exclude() 5 | export class ProjectResponseDto { 6 | @ApiProperty({ 7 | example: '1', 8 | }) 9 | @Expose() 10 | id: number; 11 | } 12 | -------------------------------------------------------------------------------- /backend/console-server/src/clickhouse/util/clickhouse-client.error.ts: -------------------------------------------------------------------------------- 1 | import { ClickhouseError } from '../core/clickhouse.error'; 2 | 3 | export class ClickhouseClientError extends ClickhouseError { 4 | constructor(message: string, error?: Error) { 5 | super(message, error); 6 | super.name = 'ClickhouseClientError'; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /frontend/src/component/atom/Span.tsx: -------------------------------------------------------------------------------- 1 | type Props = { 2 | cssOption?: string; 3 | content?: string; 4 | style?: React.CSSProperties; 5 | }; 6 | 7 | export default function Span({ cssOption, content, style }: Props) { 8 | return ( 9 | 10 | {content} 11 | 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /frontend/src/hook/api/useProjectDAU.ts: -------------------------------------------------------------------------------- 1 | import { getDAU } from '@api/get/ProjectPage'; 2 | import { useSuspenseQuery } from '@tanstack/react-query'; 3 | 4 | export default function useProjectDAU(project: string) { 5 | return useSuspenseQuery({ 6 | queryKey: ['projectDAU', project], 7 | queryFn: () => getDAU(project) 8 | }); 9 | } 10 | -------------------------------------------------------------------------------- /backend/console-server/src/log/rank/metric/host-error-rate.metric.ts: -------------------------------------------------------------------------------- 1 | import { Type } from 'class-transformer'; 2 | import { IsNumber, IsString } from 'class-validator'; 3 | 4 | export class HostErrorRateMetric { 5 | @IsString() 6 | host: string; 7 | 8 | @Type(() => Number) 9 | @IsNumber() 10 | is_error_rate: number; 11 | } 12 | -------------------------------------------------------------------------------- /frontend/src/boundary/README.md: -------------------------------------------------------------------------------- 1 | # 여기는 🌫️boundary 디렉토리입니다 2 | 3 | 에러처리를 위한 컴포넌트들을 모아놓은 디렉토리입니다. 4 | 5 | 사용방법 6 | 7 | ```tsx 8 | import CustomErrorBoundary from 'boundary/CustomErrorBoundary'; 9 | 10 |"{{projectName}}" 서비스를 위한 왓치덕스의 네임서버입니다.
8 |프로젝트를 등록해주셔서 감사합니다! DNS 등록 절차까지 마무리해주세요 :)
9 |네임 서버 정보:
10 |Best regards,
왓치덕스
7 | 이 서비스는 768px 이상의 화면에서 최적의 경험을 제공합니다.
8 |
9 | 데스크톱 환경에서 접속해주세요.
10 |