fix: secret getter
This commit is contained in:
@@ -69,7 +69,9 @@ export class SnippetService {
|
|||||||
async update(id: string, newModel: SnippetModel) {
|
async update(id: string, newModel: SnippetModel) {
|
||||||
await this.validateTypeAndCleanup(newModel)
|
await this.validateTypeAndCleanup(newModel)
|
||||||
delete newModel.created
|
delete newModel.created
|
||||||
const old = await this.model.findById(id).select('+secret').lean()
|
const old = await this.model.findById(id).select('+secret').lean({
|
||||||
|
getters: true,
|
||||||
|
})
|
||||||
|
|
||||||
if (!old) {
|
if (!old) {
|
||||||
throw new NotFoundException()
|
throw new NotFoundException()
|
||||||
@@ -87,6 +89,8 @@ export class SnippetService {
|
|||||||
// merge secret
|
// merge secret
|
||||||
if (old.secret && newModel.secret) {
|
if (old.secret && newModel.secret) {
|
||||||
const oldSecret = qs.parse(old.secret)
|
const oldSecret = qs.parse(old.secret)
|
||||||
|
|
||||||
|
// newSecret will be e.g. `{ foo: '' }`
|
||||||
const newSecret = qs.parse(newModel.secret)
|
const newSecret = qs.parse(newModel.secret)
|
||||||
|
|
||||||
// first delete key if newer secret not provide
|
// first delete key if newer secret not provide
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
|
import { stringify } from 'qs'
|
||||||
import { redisHelper } from 'test/helper/redis-mock.helper'
|
import { redisHelper } from 'test/helper/redis-mock.helper'
|
||||||
|
|
||||||
|
import { nanoid } from '@mx-space/external'
|
||||||
import { BadRequestException, NotFoundException } from '@nestjs/common'
|
import { BadRequestException, NotFoundException } from '@nestjs/common'
|
||||||
import { Test } from '@nestjs/testing'
|
import { Test } from '@nestjs/testing'
|
||||||
import { getModelForClass } from '@typegoose/typegoose'
|
import { getModelForClass } from '@typegoose/typegoose'
|
||||||
@@ -23,7 +25,14 @@ describe('test Snippet Service', () => {
|
|||||||
SnippetService,
|
SnippetService,
|
||||||
{ provide: DatabaseService, useValue: {} },
|
{ provide: DatabaseService, useValue: {} },
|
||||||
{ provide: CacheService, useValue: redis.CacheService },
|
{ provide: CacheService, useValue: redis.CacheService },
|
||||||
{ provide: ServerlessService, useValue: {} },
|
{
|
||||||
|
provide: ServerlessService,
|
||||||
|
useValue: {
|
||||||
|
isValidServerlessFunction() {
|
||||||
|
return true
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{ provide: EventManagerService, useValue: mockedEventManageService },
|
{ provide: EventManagerService, useValue: mockedEventManageService },
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -44,7 +53,7 @@ describe('test Snippet Service', () => {
|
|||||||
type: SnippetType.JSON,
|
type: SnippetType.JSON,
|
||||||
private: false,
|
private: false,
|
||||||
reference: 'root',
|
reference: 'root',
|
||||||
}
|
} as SnippetModel
|
||||||
|
|
||||||
let id = ''
|
let id = ''
|
||||||
it('should create one', async () => {
|
it('should create one', async () => {
|
||||||
@@ -79,7 +88,7 @@ describe('test Snippet Service', () => {
|
|||||||
const newSnippet = {
|
const newSnippet = {
|
||||||
...snippet,
|
...snippet,
|
||||||
raw: '{"foo": "b"}',
|
raw: '{"foo": "b"}',
|
||||||
}
|
} as SnippetModel
|
||||||
const res = await service.update(id, newSnippet)
|
const res = await service.update(id, newSnippet)
|
||||||
expect(res.raw).toBe(newSnippet.raw)
|
expect(res.raw).toBe(newSnippet.raw)
|
||||||
})
|
})
|
||||||
@@ -93,4 +102,39 @@ describe('test Snippet Service', () => {
|
|||||||
await service.delete(id)
|
await service.delete(id)
|
||||||
await expect(service.getSnippetById(id)).rejects.toThrow(NotFoundException)
|
await expect(service.getSnippetById(id)).rejects.toThrow(NotFoundException)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('update function snippet with secret', () => {
|
||||||
|
const createTestingModel = () =>
|
||||||
|
({
|
||||||
|
name: `test-fn-${nanoid.nanoid()}`,
|
||||||
|
raw: 'export default async function handler() {}',
|
||||||
|
type: SnippetType.Function,
|
||||||
|
private: false,
|
||||||
|
reference: 'root',
|
||||||
|
id: nanoid.nanoid(),
|
||||||
|
secret: 'username=123&password=123',
|
||||||
|
}) as SnippetModel
|
||||||
|
|
||||||
|
test('patch secret', async () => {
|
||||||
|
const newSnippet = createTestingModel()
|
||||||
|
const doc = await service.create(newSnippet)
|
||||||
|
|
||||||
|
await service.update(doc.id, {
|
||||||
|
...newSnippet,
|
||||||
|
secret: stringify({ username: '', password: '' }),
|
||||||
|
})
|
||||||
|
const afterUpdate = await service.getSnippetById(doc.id)
|
||||||
|
|
||||||
|
expect(afterUpdate.secret).toStrictEqual({
|
||||||
|
username: '',
|
||||||
|
password: '',
|
||||||
|
})
|
||||||
|
|
||||||
|
const raw = await service.model.findById(doc.id).select('+secret').lean({
|
||||||
|
getters: true,
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(raw.secret).toBe(newSnippet.secret)
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user