Skip to content

Commit

Permalink
add endpoint to delete PQ entry
Browse files Browse the repository at this point in the history
  • Loading branch information
StarpTech committed Apr 23, 2021
1 parent caf6cfa commit dbeed52
Show file tree
Hide file tree
Showing 6 changed files with 119 additions and 0 deletions.
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,21 @@ POST - `/persisted_query` Adds persisted query to the KV Storage.
</p>
</details>

DELETE - `/persisted_query` Deletes persisted query from KV Storage.

<details>
<summary>Example Request</summary>
<p>

```json
{
"key": "apq:foo"
}
```

</p>
</details>

### Authentication

Clients authenticate via [`Basic-Auth`](https://en.wikipedia.org/wiki/Basic_access_authentication). You have to set the cloudflare secret `ALLOWED_CLIENT_SECRETS=secret1,secret2`. The secret is used as user and pass combination.
Expand Down
7 changes: 7 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,26 @@ import { getPersistedQuery } from './routes/get-persisted-query'
import { getSchemaDiff } from './routes/get-schema-diff'
import { getSchemaValidation } from './routes/get-schema-validation'
import { registerSchema } from './routes/register-schema'
import { deletePersistedQuery } from './routes/delete-persisted-query'

const API = new Router()

// Federation
API.add('POST', '/schema/push', compose(basicAuth, registerSchema))
API.add('GET', '/schema/latest', compose(basicAuth, getComposedSchema))
API.add(
'POST',
'/schema/compose',
compose(basicAuth, getComposedSchemaByVersions),
)

// Tooling
API.add('POST', '/schema/validate', compose(basicAuth, getSchemaValidation))
API.add('POST', '/schema/diff', compose(basicAuth, getSchemaDiff))

// Persisted queries
API.add('POST', '/persisted_query', compose(basicAuth, addPersistedQuery))
API.add('GET', '/persisted_query', compose(basicAuth, getPersistedQuery))
API.add('DELETE', '/persisted_query', compose(basicAuth, deletePersistedQuery))

listen(API.run)
5 changes: 5 additions & 0 deletions src/repositories/PersistedQueries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ export function find(uid: string) {
return DB.read<PersistedQuery>(PERSISTED_QUERIES, key, 'text')
}

export function remove(pqKey: string) {
const key = key_item(pqKey)
return DB.remove(PERSISTED_QUERIES, key)
}

export function save(pqKey: string, query: string) {
const key = key_item(pqKey)
return DB.write(PERSISTED_QUERIES, key, query, false)
Expand Down
46 changes: 46 additions & 0 deletions src/routes/delete-persisted-query.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import test from 'ava'
import { NewNamespace, Request, Response } from '../test-utils'
import { addPersistedQuery } from './add-persisted-query'
import { getPersistedQuery } from './get-persisted-query'
import { deletePersistedQuery } from './delete-persisted-query'

test.serial('Should delete PQ from KV', async (t) => {
NewNamespace({
name: 'PERSISTED_QUERIES',
})

let req = Request('POST', '', { key: '123', query: 'query' })
let res = Response()
await addPersistedQuery(req, res)
t.is(res.statusCode, 200)

req = Request('GET', 'key=123')
res = Response()
await getPersistedQuery(req, res)
t.is(res.statusCode, 200)
t.deepEqual(res.body as any, {
success: true,
data: 'query',
})

req = Request('DELETE', '', { key: '123' })
res = Response()
await deletePersistedQuery(req, res)
t.is(res.statusCode, 200)

req = Request('GET', 'key=123')
res = Response()
await getPersistedQuery(req, res)
t.is(res.statusCode, 404)
})

test.serial('Should return 400 when key was not provided', async (t) => {
NewNamespace({
name: 'PERSISTED_QUERIES',
})

const req = Request('DELETE', '', {})
const res = Response()
await deletePersistedQuery(req, res)
t.is(res.statusCode, 400)
})
42 changes: 42 additions & 0 deletions src/routes/delete-persisted-query.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import type { Handler } from 'worktop'
import { object, size, string, validate } from 'superstruct'
import { remove as removePQ } from '../repositories/PersistedQueries'

interface DeletePQRequest {
key: string
query: string
}

const deleteRequest = object({
key: size(string(), 1, 100),
})

/**
* Deletes persisted query from KV Storage
*
* @param req
* @param res
*/
export const deletePersistedQuery: Handler = async function (req, res) {
const requestBody = await req.body<DeletePQRequest>()
const [error, input] = validate(requestBody, deleteRequest)
if (!input || error) {
return res.send(400, {
success: false,
error: error?.message,
})
}

const result = await removePQ(input.key)

if (!result) {
return res.send(404, {
success: false,
error: 'Could not delete persisted query',
})
}

res.send(200, {
success: true,
})
}
4 changes: 4 additions & 0 deletions src/test-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,10 @@ export const NewNamespace = (
}
return Promise.resolve(null)
}
binding.delete = (key: string) => {
store.delete(key)
return Promise.resolve()
}
binding.put = (key: string, value: any) => {
store.set(key, value)
return Promise.resolve()
Expand Down

0 comments on commit dbeed52

Please sign in to comment.