Fetching and sorting revisions

This commit is contained in:
Amit Jakubowicz 2019-12-05 07:59:21 +01:00
parent 0231a15e97
commit e9c2192eae
4 changed files with 49 additions and 6 deletions

10
@types/graphql.d.ts vendored
View File

@ -29,6 +29,7 @@ declare namespace GQL {
occurrences: Array<IEventOccurrence | null> | null;
occurrence: IEventOccurrence | null;
tags: Array<IEventTag | null> | null;
revisions: Array<IEventRevision | null> | null;
}
interface IUserOnQueryArguments {
@ -51,6 +52,10 @@ declare namespace GQL {
id: string;
}
interface IRevisionsOnQueryArguments {
filter: IRevisionsQueryFilter;
}
interface IUser {
__typename: 'User';
name: string;
@ -156,6 +161,7 @@ declare namespace GQL {
createdAt: any;
submittedAt: any | null;
dismissedBy: IUser | null;
lastChangedAt: any;
}
interface IUserRole {
@ -178,6 +184,10 @@ declare namespace GQL {
limit?: number | null;
}
interface IRevisionsQueryFilter {
limit?: number | null;
}
interface IMutation {
__typename: 'Mutation';
signup: Array<IError | null> | null;

View File

@ -1,10 +1,10 @@
import {
BaseEntity,
BaseEntity, BeforeInsert, BeforeUpdate,
Column,
Entity,
ManyToOne,
PrimaryGeneratedColumn,
} from "typeorm"
PrimaryGeneratedColumn
} from "typeorm";
import { User } from "../Auth/User.entity"
import { Event } from "../Calendar/Event.entity"
@ -31,6 +31,9 @@ export default class EventRevision extends BaseEntity {
@Column("timestamp")
createdAt: Date
@Column("timestamp")
lastChangedAt: Date
@Column("timestamp", {nullable: true})
submittedAt: Date
@ -40,6 +43,18 @@ export default class EventRevision extends BaseEntity {
@Column("timestamp", {nullable: true})
staleAt: Date
@BeforeInsert()
setCreatedAt() {
const now = new Date()
this.createdAt = now
this.lastChangedAt = now
}
@BeforeUpdate()
setLastChanged(){
this.lastChangedAt = new Date()
}
async isActive() {
return !(this.submittedAt || this.staleAt || (await this.dismissedBy)?.id)
}

View File

@ -44,7 +44,6 @@ const revisionResolvers: ResolverMap = {
}
const newRevision = new EventRevision()
newRevision.createdAt = new Date()
newRevision.event = Promise.resolve(event)
newRevision.author = Promise.resolve(context.user)
const eventRevisions = (await event.revisions) || []
@ -120,7 +119,7 @@ const revisionResolvers: ResolverMap = {
const isOwner = (await event.owner).id === (await context.user).id
if (!((await hasHigherRole(context)) || isOwner)) {
throw new Error("Only owner can request revision")
throw new Error("Only owner, embassador or admin can request revision")
}
if (event.revisionState !== EventRevisionState.CHANGES_REQUIRED) {
throw new Error(
@ -149,7 +148,20 @@ const revisionResolvers: ResolverMap = {
return revision.event
},
},
Query: {},
Query: {
revisions: async (_, req: GQL.IRevisionsOnQueryArguments, context: Context) => {
const userHasHigherRole = await hasHigherRole(context)
if (!userHasHigherRole) {
throw new Error("Insufficient permissions to dismiss a revision")
}
return EventRevision.find({
order: {
lastChangedAt: "DESC",
},
take: req.filter.limit || 20
})
}
},
EventRevision: {},
}

View File

@ -141,6 +141,9 @@ input OccurrencesQueryFilter {
categories: [Category]
limit: Int
}
input RevisionsQueryFilter {
limit: Int
}
input EventTimeInput {
timeZone: TimeZone!
@ -247,6 +250,7 @@ type EventRevision {
createdAt: Date!
submittedAt: Date
dismissedBy: User
lastChangedAt: Date!
}
input RequestRevisionInput {
eventId: ID!
@ -299,4 +303,6 @@ type Query {
occurrence(id: ID!): EventOccurrence
tags: [EventTag]
revisions(filter: RevisionsQueryFilter!): [EventRevision]
}