Skip to content

Commit 447966a

Browse files
CarsonFrdonigian
andcommitted
Create ToolUsage module
Co-authored-by: Rob Donigian <[email protected]>
1 parent d510707 commit 447966a

14 files changed

+509
-1
lines changed

dbschema/tool.gel

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,19 @@ module default {
77
required aiBased: bool {
88
default := false;
99
};
10+
11+
usages := .<tool[is Tool::Usage];
12+
}
13+
}
14+
15+
module Tool {
16+
type Usage extending default::Resource, Mixin::Embedded {
17+
required tool: default::Tool;
18+
19+
overloaded required container: default::Resource {
20+
on target delete delete source;
21+
}
22+
23+
startDate: cal::local_date;
1024
}
1125
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { Field, InputType, ObjectType } from '@nestjs/graphql';
2+
import { CalendarDate, DateField, type ID, IdField } from '~/common';
3+
import { ToolUsage } from './tool-usage.dto';
4+
5+
@InputType()
6+
export abstract class CreateToolUsage {
7+
@IdField({
8+
description: 'A resource ID',
9+
})
10+
readonly container: ID<'Resource'>;
11+
12+
@IdField({
13+
description: 'A tool ID',
14+
})
15+
readonly tool: ID<'Tool'>;
16+
17+
@DateField({ nullable: true })
18+
readonly startDate?: CalendarDate;
19+
}
20+
21+
@ObjectType()
22+
export abstract class CreateToolUsageOutput {
23+
@Field()
24+
readonly toolUsage: ToolUsage;
25+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { ObjectType } from '@nestjs/graphql';
2+
import { MutationPlaceholderOutput } from '~/common';
3+
4+
@ObjectType()
5+
export abstract class DeleteToolUsageOutput extends MutationPlaceholderOutput {}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export * from './tool-usage.dto';
2+
export * from './create-tool-usage.dto';
3+
export * from './update-tool-usage.dto';
4+
export * from './list-tool-usages.dto';
5+
export * from './delete-tool-usage.dto';
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { InputType, ObjectType } from '@nestjs/graphql';
2+
import {
3+
FilterField,
4+
PaginatedList,
5+
SecuredList,
6+
SortablePaginationInput,
7+
} from '~/common';
8+
import { ToolFilters } from '../../tool/dto';
9+
import { ToolUsage } from './tool-usage.dto';
10+
11+
@InputType()
12+
export abstract class ToolUsageFilters {
13+
@FilterField(() => ToolFilters)
14+
readonly tool?: ToolFilters & {};
15+
}
16+
17+
@InputType()
18+
export class ToolUsageListInput extends SortablePaginationInput<
19+
keyof ToolUsage
20+
>({
21+
defaultSort: 'createdAt',
22+
}) {
23+
@FilterField(() => ToolUsageFilters)
24+
readonly filter?: ToolUsageFilters;
25+
}
26+
27+
@ObjectType()
28+
export class ToolUsageListOutput extends PaginatedList(ToolUsage) {}
29+
30+
@ObjectType({
31+
description: SecuredList.descriptionFor('tool usages'),
32+
})
33+
export abstract class SecuredToolUsageList extends SecuredList(ToolUsage) {}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { Field, ObjectType } from '@nestjs/graphql';
2+
import {
3+
Resource,
4+
type Secured,
5+
SecuredDateNullable,
6+
SecuredProperty,
7+
type SetUnsecuredType,
8+
type UnsecuredDto,
9+
} from '~/common';
10+
import { type BaseNode } from '~/core/database/results';
11+
import { e } from '~/core/gel';
12+
import { type LinkTo, RegisterResource } from '~/core/resources';
13+
import { Tool } from '../../tool/dto';
14+
15+
@RegisterResource({ db: e.Tool.Usage })
16+
@ObjectType({
17+
implements: [Resource],
18+
})
19+
export class ToolUsage extends Resource {
20+
static readonly Parent = 'dynamic';
21+
22+
readonly container: Secured<BaseNode>;
23+
24+
@Field(() => Tool)
25+
readonly tool: Tool & SetUnsecuredType<UnsecuredDto<Tool>>;
26+
27+
@Field()
28+
readonly startDate: SecuredDateNullable;
29+
30+
readonly creator: LinkTo<'User'>;
31+
}
32+
33+
@ObjectType()
34+
export class SecuredToolUsage extends SecuredProperty(ToolUsage) {}
35+
36+
declare module '~/core/resources/map' {
37+
interface ResourceMap {
38+
ToolUsage: typeof ToolUsage;
39+
}
40+
interface ResourceDBMap {
41+
ToolUsage: typeof e.Tool.Usage;
42+
}
43+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { Field, InputType, ObjectType } from '@nestjs/graphql';
2+
import { type CalendarDate, DateField, type ID, IdField } from '~/common';
3+
import { ToolUsage } from './tool-usage.dto';
4+
5+
@InputType()
6+
export abstract class UpdateToolUsage {
7+
@IdField()
8+
readonly id: ID;
9+
10+
@DateField({ nullable: true })
11+
readonly startDate?: CalendarDate | null;
12+
}
13+
14+
@InputType()
15+
export abstract class UpdateToolUsageInput {
16+
@Field()
17+
readonly usage: UpdateToolUsage;
18+
}
19+
20+
@ObjectType()
21+
export abstract class UpdateToolUsageOutput {
22+
@Field()
23+
readonly toolUsage: ToolUsage;
24+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Parent, ResolveField, Resolver } from '@nestjs/graphql';
2+
import { Resource } from '~/common';
3+
import { ToolUsage } from './dto';
4+
import { ToolUsageService } from './tool-usage.service';
5+
6+
@Resolver(() => Resource, { isAbstract: true })
7+
export class ResourceToolsResolver {
8+
constructor(private readonly toolUsageService: ToolUsageService) {}
9+
10+
@ResolveField(() => [ToolUsage], {
11+
description: 'Tool usages for this resource',
12+
})
13+
async tools(@Parent() resource: Resource): Promise<ToolUsage[]> {
14+
if (resource.__typename === 'ToolUsage' || resource.__typename === 'Tool') {
15+
return [];
16+
}
17+
return await this.toolUsageService.findByContainerId(resource.id);
18+
}
19+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { type ID } from '~/common';
2+
import { type DataLoaderStrategy, LoaderFactory } from '~/core/data-loader';
3+
import { ToolUsage } from './dto';
4+
import { ToolUsageService } from './tool-usage.service';
5+
6+
@LoaderFactory(() => ToolUsage)
7+
export class ToolUsageLoader
8+
implements DataLoaderStrategy<ToolUsage, ID<ToolUsage>>
9+
{
10+
constructor(private readonly usages: ToolUsageService) {}
11+
12+
async loadMany(ids: ReadonlyArray<ID<ToolUsage>>) {
13+
return await this.usages.readMany(ids);
14+
}
15+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Module } from '@nestjs/common';
2+
import { ToolCoreModule } from '../tool/tool.module';
3+
import { ResourceToolsResolver } from './resource-tools.resolver';
4+
import { ToolUsageLoader } from './tool-usage.loader';
5+
import { ToolUsageRepository } from './tool-usage.repository';
6+
import { ToolUsageResolver } from './tool-usage.resolver';
7+
import { ToolUsageService } from './tool-usage.service';
8+
9+
@Module({
10+
imports: [ToolCoreModule],
11+
providers: [
12+
ToolUsageService,
13+
ToolUsageRepository,
14+
ToolUsageResolver,
15+
ToolUsageLoader,
16+
ResourceToolsResolver,
17+
],
18+
exports: [ToolUsageService, ResourceToolsResolver],
19+
})
20+
export class ToolUsageModule {}

0 commit comments

Comments
 (0)