feat: shared link list (#14200)

#### PR Dependency Tree


* **PR #14200** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

## Release Notes

* **New Features**
* Added a "Shared Links" panel to workspace management, enabling admins
to view all published documents within a workspace
* Added publication date tracking for published documents, now displayed
alongside shared links

* **Chores**
  * Removed deprecated `publicPages` field; use `publicDocs` instead

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
DarkSky
2026-01-02 21:07:41 +08:00
committed by GitHub
parent 9f96633b33
commit 60de882a30
13 changed files with 264 additions and 33 deletions

View File

@@ -79,6 +79,18 @@ class AdminWorkspaceMember {
status!: WorkspaceMemberStatus;
}
@ObjectType()
class AdminWorkspaceSharedLink {
@Field()
docId!: string;
@Field(() => String, { nullable: true })
title?: string | null;
@Field(() => Date, { nullable: true })
publishedAt?: Date | null;
}
@ObjectType()
export class AdminWorkspace {
@Field()
@@ -128,6 +140,9 @@ export class AdminWorkspace {
@Field(() => SafeIntResolver)
blobSize!: number;
@Field(() => [AdminWorkspaceSharedLink])
sharedLinks!: AdminWorkspaceSharedLink[];
}
@InputType()
@@ -250,6 +265,18 @@ export class AdminWorkspaceResolver {
}));
}
@ResolveField(() => [AdminWorkspaceSharedLink], {
description: 'Shared links of workspace',
})
async sharedLinks(@Parent() workspace: AdminWorkspace) {
const publicDocs = await this.models.doc.findPublics(workspace.id, 'desc');
return publicDocs.map(doc => ({
docId: doc.docId,
title: doc.title,
publishedAt: doc.publishedAt ?? null,
}));
}
@Mutation(() => AdminWorkspace, {
description: 'Update workspace flags and features for admin',
nullable: true,

View File

@@ -230,14 +230,6 @@ export class WorkspaceDocResolver {
};
}
@ResolveField(() => [DocType], {
complexity: 2,
deprecationReason: 'use [WorkspaceType.publicDocs] instead',
})
async publicPages(@Parent() workspace: WorkspaceType) {
return this.publicDocs(workspace);
}
@ResolveField(() => [DocType], {
description: 'Get public docs of a workspace',
complexity: 2,

View File

@@ -484,12 +484,10 @@ export class DocModel extends BaseModel {
/**
* Find the workspace public doc metas.
*/
async findPublics(workspaceId: string) {
async findPublics(workspaceId: string, order: 'asc' | 'desc' = 'asc') {
return await this.db.workspaceDoc.findMany({
where: {
workspaceId,
public: true,
},
where: { workspaceId, public: true },
orderBy: { publishedAt: order },
});
}
@@ -524,6 +522,7 @@ export class DocModel extends BaseModel {
return await this.upsertMeta(workspaceId, docId, {
public: true,
mode,
publishedAt: new Date(),
});
}
@@ -536,6 +535,7 @@ export class DocModel extends BaseModel {
return await this.upsertMeta(workspaceId, docId, {
public: false,
publishedAt: null,
});
}

View File

@@ -60,6 +60,7 @@ type AdminWorkspace {
owner: WorkspaceUserType
public: Boolean!
publicPageCount: Int!
sharedLinks: [AdminWorkspaceSharedLink!]!
snapshotCount: Int!
snapshotSize: SafeInt!
}
@@ -73,6 +74,12 @@ type AdminWorkspaceMember {
status: WorkspaceMemberStatus!
}
type AdminWorkspaceSharedLink {
docId: String!
publishedAt: DateTime
title: String
}
enum AdminWorkspaceSort {
BlobCount
BlobSize
@@ -2466,7 +2473,6 @@ type WorkspaceType {
"""Get public page of a workspace by page id."""
publicPage(pageId: String!): DocType @deprecated(reason: "use [WorkspaceType.doc] instead")
publicPages: [DocType!]! @deprecated(reason: "use [WorkspaceType.publicDocs] instead")
"""quota of workspace"""
quota: WorkspaceQuotaType!