Skip to content

Commit c024ea7

Browse files
feat(api): expose Project.createdAt via public GraphQL API (#7328)
1 parent 316859e commit c024ea7

File tree

7 files changed

+49
-1
lines changed

7 files changed

+49
-1
lines changed

.changeset/brave-falcons-glow.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@hive/api': patch
3+
---
4+
5+
Expose `Project.createdAt` field via the public GraphQL API.

integration-tests/testkit/flow.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,7 @@ export function createProject(input: CreateProjectInput, authToken: string) {
396396
id
397397
slug
398398
name
399+
createdAt
399400
}
400401
createdTargets {
401402
id
@@ -672,6 +673,7 @@ export function readProjectInfo(
672673
project(reference: { bySelector: $selector }) {
673674
id
674675
slug
676+
createdAt
675677
}
676678
}
677679
`),

integration-tests/tests/api/project/crud.spec.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ProjectType, ResourceAssignmentModeType } from 'testkit/gql/graphql';
2-
import { updateProjectSlug } from '../../../testkit/flow';
2+
import { readProjectInfo, updateProjectSlug } from '../../../testkit/flow';
33
import { initSeed } from '../../../testkit/seed';
44

55
test.concurrent(
@@ -31,6 +31,43 @@ test.concurrent(
3131
},
3232
);
3333

34+
test.concurrent(
35+
'creating a project should return createdAt as a valid ISO date string',
36+
async ({ expect }) => {
37+
const { createOrg } = await initSeed().createOwner();
38+
const { createProject } = await createOrg();
39+
const { project } = await createProject(ProjectType.Single);
40+
41+
expect(project.createdAt).toBeDefined();
42+
expect(typeof project.createdAt).toBe('string');
43+
// Verify it's a valid ISO date string
44+
const parsedDate = new Date(project.createdAt);
45+
expect(parsedDate.toISOString()).toBe(project.createdAt);
46+
},
47+
);
48+
49+
test.concurrent(
50+
'querying a project should return createdAt as a valid ISO date string',
51+
async ({ expect }) => {
52+
const { createOrg, ownerToken } = await initSeed().createOwner();
53+
const { createProject, organization } = await createOrg();
54+
const { project } = await createProject(ProjectType.Single);
55+
56+
const result = await readProjectInfo(
57+
{
58+
organizationSlug: organization.slug,
59+
projectSlug: project.slug,
60+
},
61+
ownerToken,
62+
).then(r => r.expectNoGraphQLErrors());
63+
64+
expect(result.project?.createdAt).toBeDefined();
65+
expect(typeof result.project?.createdAt).toBe('string');
66+
// Verify it matches the createdAt from the mutation
67+
expect(result.project?.createdAt).toBe(project.createdAt);
68+
},
69+
);
70+
3471
test.concurrent(`changing a project's slug should result changing its name`, async ({ expect }) => {
3572
const { createOrg, ownerToken } = await initSeed().createOwner();
3673
const { createProject, organization } = await createOrg();

packages/services/api/src/modules/project/module.graphql.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ export default gql`
100100
cleanId: ID! @deprecated(reason: "Use the 'slug' field instead.")
101101
name: String! @deprecated(reason: "Use the 'slug' field instead.")
102102
type: ProjectType! @tag(name: "public")
103+
createdAt: DateTime! @tag(name: "public")
103104
buildUrl: String
104105
validationUrl: String
105106
experimental_nativeCompositionPerTarget: Boolean!

packages/services/api/src/modules/project/resolvers/Project.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export const Project: Pick<
66
ProjectResolvers,
77
| 'buildUrl'
88
| 'cleanId'
9+
| 'createdAt'
910
| 'experimental_nativeCompositionPerTarget'
1011
| 'id'
1112
| 'name'

packages/services/api/src/shared/entities.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ export interface Project {
301301
orgId: string;
302302
name: string;
303303
type: ProjectType;
304+
createdAt: string;
304305
buildUrl?: string | null;
305306
validationUrl?: string | null;
306307
/**

packages/services/storage/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ export async function createStorage(
244244
orgId: project.org_id,
245245
name: project.name,
246246
type: project.type as ProjectType,
247+
createdAt: new Date(project.created_at).toISOString(),
247248
buildUrl: project.build_url,
248249
validationUrl: project.validation_url,
249250
gitRepository: project.git_repository as `${string}/${string}` | null,

0 commit comments

Comments
 (0)