Skip to content

Commit

Permalink
fixup mutator generation to allow deletes
Browse files Browse the repository at this point in the history
  • Loading branch information
tantaman committed May 17, 2022
1 parent f419dbf commit 57ee621
Show file tree
Hide file tree
Showing 10 changed files with 132 additions and 46 deletions.
5 changes: 3 additions & 2 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
1. Add another backend (besides SQL), e.g. redis
2. Test hops across backends (e.g., SQL->Neo hop)
8. Junction Edges
9. Abstract Edges
9. Abstract Edges
10. Neo/Tinkerpop/RedisGraph junction like edge defs
11. Privacy rules
12. Semantic types for fields
Expand All @@ -31,4 +31,5 @@
17. Purpose limitation
18. Byzantine fault tolerance
19. Consistency / integrity rules
20. Triggers / Observers
20. Triggers / Observers
21. Property testing and zod?
1 change: 1 addition & 0 deletions TODO.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# 5/16

- incorporate zod for schemas and test generation?
- ensure the cache we're using is pegged to the right viewer??
- generate static query all method for node classes
- in spec.createFrom -- check cache first and either
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,26 @@ ${this.getCode()}
}

private getCode(): string {
return `export default class ${this.schema.name}Mutations {
constructor(
private mutator: ICreateOrUpdateBuilder<${this.schema.name}, Data>
) {}
static for(model?: ${this.schema.name}) {
if (model) {
return new ${this.schema.name}Mutations(new UpdateMutationBuilder(spec, model))
}
return new ${this.schema.name}Mutations(new CreateMutationBuilder(spec));
return `export default class ${this.schema.name}Mutations extends MutationsBase<${
this.schema.name
}, Data> {
private constructor(
ctx: Context,
mutator: ICreateOrUpdateBuilder<${this.schema.name}, Data>
) {
super(ctx, mutator);
}
static update(model: ${this.schema.name}) {
return new ${this.schema.name}Mutations(model.ctx, new UpdateMutationBuilder(spec, model))
}
static create(ctx: Context) {
return new ${this.schema.name}Mutations(ctx, new CreateMutationBuilder(spec));
}
static delete(model: ${this.schema.name}) {
return new ${this.schema.name}Mutations(model.ctx, new DeleteMutationBuilder(spec, model));
}
${this.getMutationMethodsCode()}
Expand All @@ -52,12 +62,15 @@ ${this.getCode()}
private collectImports(): Import[] {
return [
tsImport('{ICreateOrUpdateBuilder}', null, '@aphro/mutator-runtime-ts'),
tsImport('{Context}', null, '@aphro/context-runtime-ts'),
tsImport('{MutationsBase}', null, '@aphro/mutator-runtime-ts'),
tsImport(this.schema.name, null, `./${this.schema.name}.js`),
tsImport(this.schema.name, null, `./${this.schema.name}.js`),
tsImport('{default}', 'spec', `./${nodeFn.specName(this.schema.name)}.js`),
tsImport('{Data}', null, `./${this.schema.name}.js`),
tsImport('{UpdateMutationBuilder}', null, '@aphro/mutator-runtime-ts'),
tsImport('{CreateMutationBuilder}', null, '@aphro/mutator-runtime-ts'),
tsImport('{DeleteMutationBuilder}', null, '@aphro/mutator-runtime-ts'),
...this.collectImportsForMutations(),
];
}
Expand Down
35 changes: 27 additions & 8 deletions packages/integration-tests-ts/src/generated/ComponentMutations.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,39 @@
// SIGNED-SOURCE: <e982446922c03897e3f9dfa074b543e5>
// SIGNED-SOURCE: <5cfb580ac56d1e8824cb7f2b85e4d750>
import { ICreateOrUpdateBuilder } from "@aphro/mutator-runtime-ts";
import { Context } from "@aphro/context-runtime-ts";
import { MutationsBase } from "@aphro/mutator-runtime-ts";
import Component from "./Component.js";
import { default as spec } from "./ComponentSpec.js";
import { Data } from "./Component.js";
import { UpdateMutationBuilder } from "@aphro/mutator-runtime-ts";
import { CreateMutationBuilder } from "@aphro/mutator-runtime-ts";
import { DeleteMutationBuilder } from "@aphro/mutator-runtime-ts";
import Slide from "./Slide.js";

export default class ComponentMutations {
constructor(private mutator: ICreateOrUpdateBuilder<Component, Data>) {}
export default class ComponentMutations extends MutationsBase<Component, Data> {
private constructor(
ctx: Context,
mutator: ICreateOrUpdateBuilder<Component, Data>
) {
super(ctx, mutator);
}

static update(model: Component) {
return new ComponentMutations(
model.ctx,
new UpdateMutationBuilder(spec, model)
);
}

static create(ctx: Context) {
return new ComponentMutations(ctx, new CreateMutationBuilder(spec));
}

static for(model?: Component) {
if (model) {
return new ComponentMutations(new UpdateMutationBuilder(spec, model));
}
return new ComponentMutations(new CreateMutationBuilder(spec));
static delete(model: Component) {
return new ComponentMutations(
model.ctx,
new DeleteMutationBuilder(spec, model)
);
}

create(subtype: "Text" | "Embed", slide: Slide, content: string): this {
Expand Down
29 changes: 21 additions & 8 deletions packages/integration-tests-ts/src/generated/DeckMutations.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,34 @@
// SIGNED-SOURCE: <55f3bde1cccb173b79f70aa8420420d4>
// SIGNED-SOURCE: <3490a94ac2aeb68ef2a4e735c062099b>
import { ICreateOrUpdateBuilder } from "@aphro/mutator-runtime-ts";
import { Context } from "@aphro/context-runtime-ts";
import { MutationsBase } from "@aphro/mutator-runtime-ts";
import Deck from "./Deck.js";
import { default as spec } from "./DeckSpec.js";
import { Data } from "./Deck.js";
import { UpdateMutationBuilder } from "@aphro/mutator-runtime-ts";
import { CreateMutationBuilder } from "@aphro/mutator-runtime-ts";
import { DeleteMutationBuilder } from "@aphro/mutator-runtime-ts";
import User from "./User.js";
import Slide from "./Slide.js";

export default class DeckMutations {
constructor(private mutator: ICreateOrUpdateBuilder<Deck, Data>) {}
export default class DeckMutations extends MutationsBase<Deck, Data> {
private constructor(
ctx: Context,
mutator: ICreateOrUpdateBuilder<Deck, Data>
) {
super(ctx, mutator);
}

static update(model: Deck) {
return new DeckMutations(model.ctx, new UpdateMutationBuilder(spec, model));
}

static create(ctx: Context) {
return new DeckMutations(ctx, new CreateMutationBuilder(spec));
}

static for(model?: Deck) {
if (model) {
return new DeckMutations(new UpdateMutationBuilder(spec, model));
}
return new DeckMutations(new CreateMutationBuilder(spec));
static delete(model: Deck) {
return new DeckMutations(model.ctx, new DeleteMutationBuilder(spec, model));
}

create(name: string, owner: User, selectedSlide: Slide | null): this {
Expand Down
35 changes: 27 additions & 8 deletions packages/integration-tests-ts/src/generated/SlideMutations.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,39 @@
// SIGNED-SOURCE: <2d675ae3a2673b61e5e1c372771b4633>
// SIGNED-SOURCE: <f35b443976bc9dcd0a583a415f63bbc4>
import { ICreateOrUpdateBuilder } from "@aphro/mutator-runtime-ts";
import { Context } from "@aphro/context-runtime-ts";
import { MutationsBase } from "@aphro/mutator-runtime-ts";
import Slide from "./Slide.js";
import { default as spec } from "./SlideSpec.js";
import { Data } from "./Slide.js";
import { UpdateMutationBuilder } from "@aphro/mutator-runtime-ts";
import { CreateMutationBuilder } from "@aphro/mutator-runtime-ts";
import { DeleteMutationBuilder } from "@aphro/mutator-runtime-ts";
import Deck from "./Deck.js";

export default class SlideMutations {
constructor(private mutator: ICreateOrUpdateBuilder<Slide, Data>) {}
export default class SlideMutations extends MutationsBase<Slide, Data> {
private constructor(
ctx: Context,
mutator: ICreateOrUpdateBuilder<Slide, Data>
) {
super(ctx, mutator);
}

static update(model: Slide) {
return new SlideMutations(
model.ctx,
new UpdateMutationBuilder(spec, model)
);
}

static create(ctx: Context) {
return new SlideMutations(ctx, new CreateMutationBuilder(spec));
}

static for(model?: Slide) {
if (model) {
return new SlideMutations(new UpdateMutationBuilder(spec, model));
}
return new SlideMutations(new CreateMutationBuilder(spec));
static delete(model: Slide) {
return new SlideMutations(
model.ctx,
new DeleteMutationBuilder(spec, model)
);
}

create(deck: Deck, order: number): this {
Expand Down
29 changes: 21 additions & 8 deletions packages/integration-tests-ts/src/generated/UserMutations.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,32 @@
// SIGNED-SOURCE: <b99750e12dbb708a7a622941d023b786>
// SIGNED-SOURCE: <6f271dc110baedb012d220e6d5ed9943>
import { ICreateOrUpdateBuilder } from "@aphro/mutator-runtime-ts";
import { Context } from "@aphro/context-runtime-ts";
import { MutationsBase } from "@aphro/mutator-runtime-ts";
import User from "./User.js";
import { default as spec } from "./UserSpec.js";
import { Data } from "./User.js";
import { UpdateMutationBuilder } from "@aphro/mutator-runtime-ts";
import { CreateMutationBuilder } from "@aphro/mutator-runtime-ts";
import { DeleteMutationBuilder } from "@aphro/mutator-runtime-ts";

export default class UserMutations {
constructor(private mutator: ICreateOrUpdateBuilder<User, Data>) {}
export default class UserMutations extends MutationsBase<User, Data> {
private constructor(
ctx: Context,
mutator: ICreateOrUpdateBuilder<User, Data>
) {
super(ctx, mutator);
}

static update(model: User) {
return new UserMutations(model.ctx, new UpdateMutationBuilder(spec, model));
}

static create(ctx: Context) {
return new UserMutations(ctx, new CreateMutationBuilder(spec));
}

static for(model?: User) {
if (model) {
return new UserMutations(new UpdateMutationBuilder(spec, model));
}
return new UserMutations(new CreateMutationBuilder(spec));
static delete(model: User) {
return new UserMutations(model.ctx, new DeleteMutationBuilder(spec, model));
}

create(name: string): this {
Expand Down
4 changes: 2 additions & 2 deletions packages/mutator-runtime-ts/src/MutationsBase.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { IModel } from '@aphro/model-runtime-ts';
import { ICreateOrUpdateBuilder } from './Mutator.js';
import { IMutationBuilder } from './Mutator.js';
import { Changeset, ChangesetOptions } from './Changeset.js';
import { commit } from './commit.js';
import { Context } from '@aphro/context-runtime-ts';

export default abstract class MutationsBase<M extends IModel<D>, D extends Object> {
readonly ctx: Context;
constructor(ctx: Context, protected mutator: ICreateOrUpdateBuilder<M, D>) {
constructor(ctx: Context, protected mutator: IMutationBuilder<M, D>) {
this.ctx = ctx;
}

Expand Down
6 changes: 6 additions & 0 deletions packages/mutator-runtime-ts/src/Mutator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ import {

export interface IMutationBuilder<M extends IModel<D>, D extends Object> {
toChangeset(options?: ChangesetOptions): Changeset<M, D>;
// TODO: remove this once we get mutations generation complete
// we don't need `set` for `delete`
set(newData: Partial<D>): this;
}

export interface ICreateOrUpdateBuilder<M extends IModel<D>, D extends Object>
Expand All @@ -22,6 +25,9 @@ abstract class MutationBuilder<M extends IModel<D>, D extends Object>
{
constructor(protected spec: ModelSpec<M, D>, protected data: Partial<D>) {}
abstract toChangeset(): Changeset<M, D>;
set(newData: Partial<D>): this {
throw new Error('You cannot call `set` when deleting something');
}
}

abstract class CreateOrUpdateBuilder<M extends IModel<D>, D extends Object> extends MutationBuilder<
Expand Down
1 change: 1 addition & 0 deletions packages/mutator-runtime-ts/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export * from './Mutator.js';
export * from './commit.js';
export { default as MutationsBase } from './MutationsBase.js';

0 comments on commit 57ee621

Please sign in to comment.