1 parent
f0f36c4f48
commit
40d579cdb9
30 files changed
+114
-13
No files matched your search
@@ -12,3 +12,5 @@ npx prisma migrate dev --name init
|
|||||||
npx prisma generate
|
npx prisma generate
|
||||||
|
|
||||||
npx auth@latest generate
|
npx auth@latest generate
|
||||||
|
|
||||||
|
npx prisma migrate deploy
|
||||||
+19
@@ -1,3 +1,9 @@
|
|||||||
|
/*
|
||||||
|
Warnings:
|
||||||
|
|
||||||
|
- A unique constraint covering the columns `[providerId,accountId]` on the table `account` will be added. If there are existing duplicate values, this will fail.
|
||||||
|
|
||||||
|
*/
|
||||||
-- CreateTable
|
-- CreateTable
|
||||||
CREATE TABLE "issue" (
|
CREATE TABLE "issue" (
|
||||||
"id" SERIAL NOT NULL,
|
"id" SERIAL NOT NULL,
|
||||||
@@ -9,6 +15,7 @@ CREATE TABLE "issue" (
|
|||||||
"assigneeId" TEXT,
|
"assigneeId" TEXT,
|
||||||
"reporterId" TEXT NOT NULL,
|
"reporterId" TEXT NOT NULL,
|
||||||
"projectId" TEXT NOT NULL,
|
"projectId" TEXT NOT NULL,
|
||||||
|
"dueDate" TIMESTAMPTZ(3),
|
||||||
"createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
"createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
"updatedAt" TIMESTAMPTZ(3) NOT NULL,
|
"updatedAt" TIMESTAMPTZ(3) NOT NULL,
|
||||||
|
|
||||||
@@ -49,6 +56,15 @@ CREATE INDEX "issue_reporterId_idx" ON "issue"("reporterId");
|
|||||||
-- CreateIndex
|
-- CreateIndex
|
||||||
CREATE INDEX "issue_projectId_idx" ON "issue"("projectId");
|
CREATE INDEX "issue_projectId_idx" ON "issue"("projectId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "issue_createdAt_idx" ON "issue"("createdAt");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "issue_projectId_createdAt_idx" ON "issue"("projectId", "createdAt");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "issue_dueDate_idx" ON "issue"("dueDate");
|
||||||
|
|
||||||
-- CreateIndex
|
-- CreateIndex
|
||||||
CREATE INDEX "project_createdAt_idx" ON "project"("createdAt");
|
CREATE INDEX "project_createdAt_idx" ON "project"("createdAt");
|
||||||
|
|
||||||
@@ -64,6 +80,9 @@ CREATE INDEX "project_member_userId_idx" ON "project_member"("userId");
|
|||||||
-- CreateIndex
|
-- CreateIndex
|
||||||
CREATE UNIQUE INDEX "project_member_projectId_userId_key" ON "project_member"("projectId", "userId");
|
CREATE UNIQUE INDEX "project_member_projectId_userId_key" ON "project_member"("projectId", "userId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "account_providerId_accountId_key" ON "account"("providerId", "accountId");
|
||||||
|
|
||||||
-- AddForeignKey
|
-- AddForeignKey
|
||||||
ALTER TABLE "issue" ADD CONSTRAINT "issue_assigneeId_fkey" FOREIGN KEY ("assigneeId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
ALTER TABLE "issue" ADD CONSTRAINT "issue_assigneeId_fkey" FOREIGN KEY ("assigneeId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
+12
-7
@@ -58,6 +58,7 @@ model Account {
|
|||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
|
|
||||||
|
@@unique([providerId, accountId])
|
||||||
@@index([userId])
|
@@index([userId])
|
||||||
@@map("account")
|
@@map("account")
|
||||||
}
|
}
|
||||||
@@ -75,25 +76,29 @@ model Verification {
|
|||||||
}
|
}
|
||||||
|
|
||||||
model Issue {
|
model Issue {
|
||||||
id Int @id @default(autoincrement())
|
id Int @id @default(autoincrement())
|
||||||
key String
|
key String
|
||||||
title String
|
title String
|
||||||
content String?
|
content String?
|
||||||
status String
|
status String
|
||||||
priority Int @default(0)
|
priority Int @default(0)
|
||||||
assigneeId String?
|
assigneeId String?
|
||||||
assignee User? @relation(name: "assigneeIssues", fields: [assigneeId], references: [id], onDelete: Cascade)
|
assignee User? @relation(name: "assigneeIssues", fields: [assigneeId], references: [id], onDelete: Cascade)
|
||||||
reporterId String
|
reporterId String
|
||||||
reporter User @relation(name: "reporterIssues", fields: [reporterId], references: [id], onDelete: Cascade)
|
reporter User @relation(name: "reporterIssues", fields: [reporterId], references: [id], onDelete: Cascade)
|
||||||
projectId String
|
projectId String
|
||||||
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||||||
createdAt DateTime @default(now()) @db.Timestamptz(3)
|
dueDate DateTime? @db.Timestamptz(3)
|
||||||
updatedAt DateTime @updatedAt @db.Timestamptz(3)
|
createdAt DateTime @default(now()) @db.Timestamptz(3)
|
||||||
|
updatedAt DateTime @updatedAt @db.Timestamptz(3)
|
||||||
|
|
||||||
@@index([status])
|
@@index([status])
|
||||||
@@index([assigneeId])
|
@@index([assigneeId])
|
||||||
@@index([reporterId])
|
@@index([reporterId])
|
||||||
@@index([projectId])
|
@@index([projectId])
|
||||||
|
@@index([createdAt])
|
||||||
|
@@index([projectId, createdAt])
|
||||||
|
@@index([dueDate])
|
||||||
@@map("issue")
|
@@map("issue")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ export class IssueWithUsersDto {
|
|||||||
assignee: UserDto | null;
|
assignee: UserDto | null;
|
||||||
reporter: UserDto;
|
reporter: UserDto;
|
||||||
projectId: string;
|
projectId: string;
|
||||||
|
dueDate: Date | null;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
updatedAt: Date;
|
updatedAt: Date;
|
||||||
}
|
}
|
||||||
@@ -8,6 +8,7 @@ export class IssueDto {
|
|||||||
assigneeId: string | null;
|
assigneeId: string | null;
|
||||||
reporterId: string;
|
reporterId: string;
|
||||||
projectId: string;
|
projectId: string;
|
||||||
|
dueDate: Date | null;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
updatedAt: Date;
|
updatedAt: Date;
|
||||||
}
|
}
|
||||||
@@ -15,6 +15,7 @@ export class IssueApplicationMapper {
|
|||||||
assigneeId: issue.assignee,
|
assigneeId: issue.assignee,
|
||||||
reporterId: issue.reporter,
|
reporterId: issue.reporter,
|
||||||
projectId: issue.projectId,
|
projectId: issue.projectId,
|
||||||
|
dueDate: issue.dueDate,
|
||||||
createdAt: issue.createdAt,
|
createdAt: issue.createdAt,
|
||||||
updatedAt: issue.updatedAt,
|
updatedAt: issue.updatedAt,
|
||||||
};
|
};
|
||||||
@@ -39,6 +40,7 @@ export class IssueApplicationMapper {
|
|||||||
assignee: issue.assignee ? (usersById.get(issue.assignee) ?? null) : null,
|
assignee: issue.assignee ? (usersById.get(issue.assignee) ?? null) : null,
|
||||||
reporter,
|
reporter,
|
||||||
projectId: issue.projectId,
|
projectId: issue.projectId,
|
||||||
|
dueDate: issue.dueDate,
|
||||||
createdAt: issue.createdAt,
|
createdAt: issue.createdAt,
|
||||||
updatedAt: issue.updatedAt,
|
updatedAt: issue.updatedAt,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ const buildIssue = (overrides: Partial<{ assignee: string | null; reporter: stri
|
|||||||
assignee: 'assignee' in overrides ? (overrides.assignee ?? null) : 'user-2',
|
assignee: 'assignee' in overrides ? (overrides.assignee ?? null) : 'user-2',
|
||||||
reporter: overrides.reporter ?? 'user-1',
|
reporter: overrides.reporter ?? 'user-1',
|
||||||
projectId: 'project-1',
|
projectId: 'project-1',
|
||||||
|
dueDate: null,
|
||||||
createdAt: new Date(),
|
createdAt: new Date(),
|
||||||
updatedAt: new Date(),
|
updatedAt: new Date(),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -7,5 +7,6 @@ export class CreateIssueCommand {
|
|||||||
public readonly content?: string,
|
public readonly content?: string,
|
||||||
public readonly priority?: number,
|
public readonly priority?: number,
|
||||||
public readonly assignee?: string,
|
public readonly assignee?: string,
|
||||||
|
public readonly dueDate?: Date,
|
||||||
) {}
|
) {}
|
||||||
}
|
}
|
||||||
@@ -56,6 +56,7 @@ describe('CreateIssueUseCase', () => {
|
|||||||
assignee: issue.assignee,
|
assignee: issue.assignee,
|
||||||
reporter: issue.reporter,
|
reporter: issue.reporter,
|
||||||
projectId: issue.projectId,
|
projectId: issue.projectId,
|
||||||
|
dueDate: issue.dueDate,
|
||||||
createdAt: issue.createdAt,
|
createdAt: issue.createdAt,
|
||||||
updatedAt: issue.updatedAt,
|
updatedAt: issue.updatedAt,
|
||||||
}),
|
}),
|
||||||
@@ -104,6 +105,7 @@ describe('CreateIssueUseCase', () => {
|
|||||||
assignee: issue.assignee,
|
assignee: issue.assignee,
|
||||||
reporter: issue.reporter,
|
reporter: issue.reporter,
|
||||||
projectId: issue.projectId,
|
projectId: issue.projectId,
|
||||||
|
dueDate: issue.dueDate,
|
||||||
createdAt: issue.createdAt,
|
createdAt: issue.createdAt,
|
||||||
updatedAt: issue.updatedAt,
|
updatedAt: issue.updatedAt,
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ export class CreateIssueUseCase {
|
|||||||
assignee: command.assignee,
|
assignee: command.assignee,
|
||||||
reporter: command.reporter,
|
reporter: command.reporter,
|
||||||
projectId: command.projectId,
|
projectId: command.projectId,
|
||||||
|
dueDate: command.dueDate,
|
||||||
});
|
});
|
||||||
|
|
||||||
const issue = await this.issueRepository.create(draft);
|
const issue = await this.issueRepository.create(draft);
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ const buildIssue = () =>
|
|||||||
assignee: null,
|
assignee: null,
|
||||||
reporter: 'user-1',
|
reporter: 'user-1',
|
||||||
projectId: 'project-1',
|
projectId: 'project-1',
|
||||||
|
dueDate: null,
|
||||||
createdAt: new Date(),
|
createdAt: new Date(),
|
||||||
updatedAt: new Date(),
|
updatedAt: new Date(),
|
||||||
});
|
});
|
||||||
|
|||||||
+1
@@ -18,6 +18,7 @@ const buildIssue = () =>
|
|||||||
assignee: 'user-2',
|
assignee: 'user-2',
|
||||||
reporter: 'user-1',
|
reporter: 'user-1',
|
||||||
projectId: 'project-1',
|
projectId: 'project-1',
|
||||||
|
dueDate: null,
|
||||||
createdAt: new Date(),
|
createdAt: new Date(),
|
||||||
updatedAt: new Date(),
|
updatedAt: new Date(),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ const buildIssue = () =>
|
|||||||
assignee: 'user-2',
|
assignee: 'user-2',
|
||||||
reporter: 'user-1',
|
reporter: 'user-1',
|
||||||
projectId: 'project-1',
|
projectId: 'project-1',
|
||||||
|
dueDate: null,
|
||||||
createdAt: new Date(),
|
createdAt: new Date(),
|
||||||
updatedAt: new Date(),
|
updatedAt: new Date(),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ const buildIssue = (id: number) =>
|
|||||||
assignee: null,
|
assignee: null,
|
||||||
reporter: 'user-1',
|
reporter: 'user-1',
|
||||||
projectId: 'project-1',
|
projectId: 'project-1',
|
||||||
|
dueDate: null,
|
||||||
createdAt: new Date(),
|
createdAt: new Date(),
|
||||||
updatedAt: new Date(),
|
updatedAt: new Date(),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -7,5 +7,6 @@ export class UpdateIssueCommand {
|
|||||||
public readonly status?: string,
|
public readonly status?: string,
|
||||||
public readonly priority?: number,
|
public readonly priority?: number,
|
||||||
public readonly assignee?: string | null,
|
public readonly assignee?: string | null,
|
||||||
|
public readonly dueDate?: Date | null,
|
||||||
) {}
|
) {}
|
||||||
}
|
}
|
||||||
@@ -20,6 +20,7 @@ const buildIssue = () =>
|
|||||||
assignee: null,
|
assignee: null,
|
||||||
reporter: 'user-1',
|
reporter: 'user-1',
|
||||||
projectId: 'project-1',
|
projectId: 'project-1',
|
||||||
|
dueDate: null,
|
||||||
createdAt: new Date('2026-01-01T00:00:00.000Z'),
|
createdAt: new Date('2026-01-01T00:00:00.000Z'),
|
||||||
updatedAt: new Date('2026-01-01T00:00:00.000Z'),
|
updatedAt: new Date('2026-01-01T00:00:00.000Z'),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -53,6 +53,10 @@ export class UpdateIssueUseCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (command.dueDate !== undefined) {
|
||||||
|
issue.updateDueDate(command.dueDate);
|
||||||
|
}
|
||||||
|
|
||||||
await this.issueRepository.update(issue);
|
await this.issueRepository.update(issue);
|
||||||
const dto = await this.issueUserExpander.expand(issue);
|
const dto = await this.issueUserExpander.expand(issue);
|
||||||
|
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ describe('Issue', () => {
|
|||||||
assignee: 'user-3',
|
assignee: 'user-3',
|
||||||
reporter: 'user-1',
|
reporter: 'user-1',
|
||||||
projectId: 'project-1',
|
projectId: 'project-1',
|
||||||
|
dueDate: null,
|
||||||
createdAt: now,
|
createdAt: now,
|
||||||
updatedAt: now,
|
updatedAt: now,
|
||||||
});
|
});
|
||||||
@@ -94,6 +95,7 @@ describe('Issue', () => {
|
|||||||
assignee: null,
|
assignee: null,
|
||||||
reporter: 'user-1',
|
reporter: 'user-1',
|
||||||
projectId: 'project-1',
|
projectId: 'project-1',
|
||||||
|
dueDate: null,
|
||||||
createdAt: new Date('2026-01-01T00:00:00.000Z'),
|
createdAt: new Date('2026-01-01T00:00:00.000Z'),
|
||||||
updatedAt: new Date('2026-01-01T00:00:00.000Z'),
|
updatedAt: new Date('2026-01-01T00:00:00.000Z'),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ interface IssueProps {
|
|||||||
assignee: string | null;
|
assignee: string | null;
|
||||||
reporter: string;
|
reporter: string;
|
||||||
projectId: string;
|
projectId: string;
|
||||||
|
dueDate: Date | null;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
updatedAt: Date;
|
updatedAt: Date;
|
||||||
}
|
}
|
||||||
@@ -40,6 +41,7 @@ export class Issue {
|
|||||||
assignee?: string | null;
|
assignee?: string | null;
|
||||||
reporter: string;
|
reporter: string;
|
||||||
projectId: string;
|
projectId: string;
|
||||||
|
dueDate?: Date | null;
|
||||||
}): Issue {
|
}): Issue {
|
||||||
const issue = new Issue({
|
const issue = new Issue({
|
||||||
id: null,
|
id: null,
|
||||||
@@ -51,6 +53,7 @@ export class Issue {
|
|||||||
assignee: params.assignee ?? null,
|
assignee: params.assignee ?? null,
|
||||||
reporter: params.reporter,
|
reporter: params.reporter,
|
||||||
projectId: params.projectId,
|
projectId: params.projectId,
|
||||||
|
dueDate: params.dueDate ?? null,
|
||||||
createdAt: new Date(),
|
createdAt: new Date(),
|
||||||
updatedAt: new Date(),
|
updatedAt: new Date(),
|
||||||
});
|
});
|
||||||
@@ -71,6 +74,7 @@ export class Issue {
|
|||||||
assignee: string | null;
|
assignee: string | null;
|
||||||
reporter: string;
|
reporter: string;
|
||||||
projectId: string;
|
projectId: string;
|
||||||
|
dueDate: Date | null;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
updatedAt: Date;
|
updatedAt: Date;
|
||||||
}): Issue {
|
}): Issue {
|
||||||
@@ -84,6 +88,7 @@ export class Issue {
|
|||||||
assignee: props.assignee,
|
assignee: props.assignee,
|
||||||
reporter: props.reporter,
|
reporter: props.reporter,
|
||||||
projectId: props.projectId,
|
projectId: props.projectId,
|
||||||
|
dueDate: props.dueDate,
|
||||||
createdAt: props.createdAt,
|
createdAt: props.createdAt,
|
||||||
updatedAt: props.updatedAt,
|
updatedAt: props.updatedAt,
|
||||||
});
|
});
|
||||||
@@ -125,6 +130,10 @@ export class Issue {
|
|||||||
return this.props.projectId;
|
return this.props.projectId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get dueDate(): Date | null {
|
||||||
|
return this.props.dueDate;
|
||||||
|
}
|
||||||
|
|
||||||
get createdAt(): Date {
|
get createdAt(): Date {
|
||||||
return this.props.createdAt;
|
return this.props.createdAt;
|
||||||
}
|
}
|
||||||
@@ -163,6 +172,11 @@ export class Issue {
|
|||||||
this.touch();
|
this.touch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateDueDate(dueDate: Date | null): void {
|
||||||
|
this.props.dueDate = dueDate;
|
||||||
|
this.touch();
|
||||||
|
}
|
||||||
|
|
||||||
private touch(): void {
|
private touch(): void {
|
||||||
this.props.updatedAt = new Date();
|
this.props.updatedAt = new Date();
|
||||||
this.addDomainEvent(new IssueUpdatedEvent(this.key));
|
this.addDomainEvent(new IssueUpdatedEvent(this.key));
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ describe('IssuePrismaMapper', () => {
|
|||||||
assigneeId: 'user-2',
|
assigneeId: 'user-2',
|
||||||
reporterId: 'user-1',
|
reporterId: 'user-1',
|
||||||
projectId: 'project-1',
|
projectId: 'project-1',
|
||||||
|
dueDate: null,
|
||||||
createdAt: new Date('2026-01-01T00:00:00.000Z'),
|
createdAt: new Date('2026-01-01T00:00:00.000Z'),
|
||||||
updatedAt: new Date('2026-01-02T00:00:00.000Z'),
|
updatedAt: new Date('2026-01-02T00:00:00.000Z'),
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ export class IssuePrismaMapper {
|
|||||||
assignee: record.assigneeId,
|
assignee: record.assigneeId,
|
||||||
reporter: record.reporterId,
|
reporter: record.reporterId,
|
||||||
projectId: record.projectId,
|
projectId: record.projectId,
|
||||||
|
dueDate: record.dueDate,
|
||||||
createdAt: record.createdAt,
|
createdAt: record.createdAt,
|
||||||
updatedAt: record.updatedAt,
|
updatedAt: record.updatedAt,
|
||||||
});
|
});
|
||||||
@@ -29,6 +30,7 @@ export class IssuePrismaMapper {
|
|||||||
assigneeId: issue.assignee,
|
assigneeId: issue.assignee,
|
||||||
reporterId: issue.reporter,
|
reporterId: issue.reporter,
|
||||||
projectId: issue.projectId,
|
projectId: issue.projectId,
|
||||||
|
dueDate: issue.dueDate,
|
||||||
createdAt: issue.createdAt,
|
createdAt: issue.createdAt,
|
||||||
updatedAt: issue.updatedAt,
|
updatedAt: issue.updatedAt,
|
||||||
};
|
};
|
||||||
@@ -41,6 +43,7 @@ export class IssuePrismaMapper {
|
|||||||
status: issue.status,
|
status: issue.status,
|
||||||
priority: issue.priority,
|
priority: issue.priority,
|
||||||
assigneeId: issue.assignee,
|
assigneeId: issue.assignee,
|
||||||
|
dueDate: issue.dueDate,
|
||||||
updatedAt: issue.updatedAt,
|
updatedAt: issue.updatedAt,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ export class IssueController {
|
|||||||
dto.content,
|
dto.content,
|
||||||
dto.priority,
|
dto.priority,
|
||||||
dto.assignee,
|
dto.assignee,
|
||||||
|
dto.dueDate !== undefined ? new Date(dto.dueDate) : undefined,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -132,7 +133,16 @@ export class IssueController {
|
|||||||
) {
|
) {
|
||||||
return this.handleErrors(() =>
|
return this.handleErrors(() =>
|
||||||
this.updateIssueUseCase.execute(
|
this.updateIssueUseCase.execute(
|
||||||
new UpdateIssueCommand(id, session.user.id, dto.title, dto.content, dto.status, dto.priority, dto.assignee),
|
new UpdateIssueCommand(
|
||||||
|
id,
|
||||||
|
session.user.id,
|
||||||
|
dto.title,
|
||||||
|
dto.content,
|
||||||
|
dto.status,
|
||||||
|
dto.priority,
|
||||||
|
dto.assignee,
|
||||||
|
dto.dueDate === undefined ? undefined : dto.dueDate === null ? null : new Date(dto.dueDate),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { IsInt, IsNotEmpty, IsOptional, IsString, Max, MaxLength, Min } from 'class-validator';
|
import { IsDateString, IsInt, IsNotEmpty, IsOptional, IsString, Max, MaxLength, Min } from 'class-validator';
|
||||||
|
|
||||||
export class CreateIssueRequestDto {
|
export class CreateIssueRequestDto {
|
||||||
@IsString()
|
@IsString()
|
||||||
@@ -27,4 +27,8 @@ export class CreateIssueRequestDto {
|
|||||||
@IsOptional()
|
@IsOptional()
|
||||||
@IsString()
|
@IsString()
|
||||||
assignee?: string;
|
assignee?: string;
|
||||||
|
|
||||||
|
@IsOptional()
|
||||||
|
@IsDateString()
|
||||||
|
dueDate?: string;
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { IsIn, IsInt, IsOptional, IsString, Max, MaxLength, Min } from 'class-validator';
|
import { IsDateString, IsIn, IsInt, IsOptional, IsString, Max, MaxLength, Min } from 'class-validator';
|
||||||
import { ISSUE_STATUSES } from '../../domain/value-objects/issue-status.vo.js';
|
import { ISSUE_STATUSES } from '../../domain/value-objects/issue-status.vo.js';
|
||||||
|
|
||||||
export class UpdateIssueRequestDto {
|
export class UpdateIssueRequestDto {
|
||||||
@@ -24,4 +24,8 @@ export class UpdateIssueRequestDto {
|
|||||||
@IsOptional()
|
@IsOptional()
|
||||||
@IsString()
|
@IsString()
|
||||||
assignee?: string | null;
|
assignee?: string | null;
|
||||||
|
|
||||||
|
@IsOptional()
|
||||||
|
@IsDateString()
|
||||||
|
dueDate?: string | null;
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Field, InputType, Int } from '@nestjs/graphql';
|
import { Field, InputType, Int } from '@nestjs/graphql';
|
||||||
import { IsInt, IsNotEmpty, IsOptional, IsString, Max, MaxLength, Min } from 'class-validator';
|
import { IsDate, IsInt, IsNotEmpty, IsOptional, IsString, Max, MaxLength, Min } from 'class-validator';
|
||||||
|
|
||||||
@InputType()
|
@InputType()
|
||||||
export class CreateIssueInput {
|
export class CreateIssueInput {
|
||||||
@@ -35,4 +35,9 @@ export class CreateIssueInput {
|
|||||||
@IsOptional()
|
@IsOptional()
|
||||||
@IsString()
|
@IsString()
|
||||||
assignee?: string;
|
assignee?: string;
|
||||||
|
|
||||||
|
@Field(() => Date, { nullable: true })
|
||||||
|
@IsOptional()
|
||||||
|
@IsDate()
|
||||||
|
dueDate?: Date;
|
||||||
}
|
}
|
||||||
@@ -36,6 +36,9 @@ export class IssueDetailType {
|
|||||||
@Field()
|
@Field()
|
||||||
projectId: string;
|
projectId: string;
|
||||||
|
|
||||||
|
@Field(() => Date, { nullable: true })
|
||||||
|
dueDate: Date | null;
|
||||||
|
|
||||||
@Field(() => Date)
|
@Field(() => Date)
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,9 @@ export class IssueType {
|
|||||||
@Field()
|
@Field()
|
||||||
projectId: string;
|
projectId: string;
|
||||||
|
|
||||||
|
@Field(() => Date, { nullable: true })
|
||||||
|
dueDate: Date | null;
|
||||||
|
|
||||||
@Field(() => Date)
|
@Field(() => Date)
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Field, InputType, Int } from '@nestjs/graphql';
|
import { Field, InputType, Int } from '@nestjs/graphql';
|
||||||
import { IsIn, IsInt, IsOptional, IsString, Max, MaxLength, Min } from 'class-validator';
|
import { IsDate, IsIn, IsInt, IsOptional, IsString, Max, MaxLength, Min } from 'class-validator';
|
||||||
import { ISSUE_STATUSES } from '../../domain/value-objects/issue-status.vo.js';
|
import { ISSUE_STATUSES } from '../../domain/value-objects/issue-status.vo.js';
|
||||||
|
|
||||||
@InputType()
|
@InputType()
|
||||||
@@ -31,4 +31,9 @@ export class UpdateIssueInput {
|
|||||||
@IsOptional()
|
@IsOptional()
|
||||||
@IsString()
|
@IsString()
|
||||||
assignee?: string | null;
|
assignee?: string | null;
|
||||||
|
|
||||||
|
@Field(() => Date, { nullable: true })
|
||||||
|
@IsOptional()
|
||||||
|
@IsDate()
|
||||||
|
dueDate?: Date | null;
|
||||||
}
|
}
|
||||||
@@ -66,6 +66,7 @@ export class IssueResolver {
|
|||||||
input.content,
|
input.content,
|
||||||
input.priority,
|
input.priority,
|
||||||
input.assignee,
|
input.assignee,
|
||||||
|
input.dueDate,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -87,6 +88,7 @@ export class IssueResolver {
|
|||||||
input.status,
|
input.status,
|
||||||
input.priority,
|
input.priority,
|
||||||
input.assignee,
|
input.assignee,
|
||||||
|
input.dueDate,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2025.float16.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.es2023.full.d.ts","./node_modules/reflect-metadata/index.d.ts","./node_modules/@nestjs/common/decorators/core/bind.decorator.d.ts","./node_modules/@nestjs/common/interfaces/abstract.interface.d.ts","./node_modules/@nestjs/common/interfaces/controllers/controller-metadata.interface.d.ts","./node_modules/@nestjs/common/interfaces/controllers/controller.interface.d.ts","./node_modules/@nestjs/common/interfaces/features/arguments-host.interface.d.ts","./node_modules/@nestjs/common/interfaces/exceptions/exception-filter.interface.d.ts","./node_modules/rxjs/dist/types/internal/subscription.d.ts","./node_modules/rxjs/dist/types/internal/subscriber.d.ts","./node_modules/rxjs/dist/types/internal/operator.d.ts","./node_modules/rxjs/dist/types/internal/observable.d.ts","./node_modules/rxjs/dist/types/internal/types.d.ts","./node_modules/rxjs/dist/types/internal/operators/audit.d.ts","./node_modules/rxjs/dist/types/internal/operators/audittime.d.ts","./node_modules/rxjs/dist/types/internal/operators/buffer.d.ts","./node_modules/rxjs/dist/types/internal/operators/buffercount.d.ts","./node_modules/rxjs/dist/types/internal/operators/buffertime.d.ts","./node_modules/rxjs/dist/types/internal/operators/buffertoggle.d.tsLine truncated
|
{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2025.float16.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.es2023.full.d.ts","./node_modules/reflect-metadata/index.d.ts","./node_modules/@nestjs/common/decorators/core/bind.decorator.d.ts","./node_modules/@nestjs/common/interfaces/abstract.interface.d.ts","./node_modules/@nestjs/common/interfaces/controllers/controller-metadata.interface.d.ts","./node_modules/@nestjs/common/interfaces/controllers/controller.interface.d.ts","./node_modules/@nestjs/common/interfaces/features/arguments-host.interface.d.ts","./node_modules/@nestjs/common/interfaces/exceptions/exception-filter.interface.d.ts","./node_modules/rxjs/dist/types/internal/subscription.d.ts","./node_modules/rxjs/dist/types/internal/subscriber.d.ts","./node_modules/rxjs/dist/types/internal/operator.d.ts","./node_modules/rxjs/dist/types/internal/observable.d.ts","./node_modules/rxjs/dist/types/internal/types.d.ts","./node_modules/rxjs/dist/types/internal/operators/audit.d.ts","./node_modules/rxjs/dist/types/internal/operators/audittime.d.ts","./node_modules/rxjs/dist/types/internal/operators/buffer.d.ts","./node_modules/rxjs/dist/types/internal/operators/buffercount.d.ts","./node_modules/rxjs/dist/types/internal/operators/buffertime.d.ts","./node_modules/rxjs/dist/types/internal/operators/buffertoggle.d.tsLine truncated
|
||||||
Reference in new issue
Block a user