Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add lastResult field to feed type #9

Merged
merged 3 commits into from
Jun 11, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/api/src/database.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export class MongoManager {
uri =
uri ||
`mongodb://${process.env.MONGO_DATABASE_USERNAME}:${process.env.MONGO_DATABASE_PASSWORD}@${process.env.DB_HOSTNAME}:${process.env.MONGO_PORT}/${process.env.MONGO_INITDB_DATABASE}`
console.log('uri', uri)

return this.connect(uri, process.env.MONGO_INITDB_DATABASE)
}

Expand Down
4 changes: 2 additions & 2 deletions packages/api/src/repository/Feed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ export class FeedRepository {
return this._normalizeId(response.ops[0])
}

async addPriceRequest (feedId: ObjectId, priceRequestId: ObjectId) {
async addResultRequest (feedId: ObjectId, resultRequestId: ObjectId) {
const response = await this.collection.findOneAndUpdate(
{ _id: feedId },
{ $push: { requests: priceRequestId } },
{ $push: { requests: resultRequestId } },
{ returnDocument: 'after' }
)

Expand Down
30 changes: 0 additions & 30 deletions packages/api/src/repository/PriceRequest.ts

This file was deleted.

49 changes: 49 additions & 0 deletions packages/api/src/repository/ResultRequest.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { Db, Collection, ObjectId } from 'mongodb'
import { ResultRequestDbObject } from '../generated/types'

export class ResultRequestRepository {
collection: Collection<ResultRequestDbObject>

constructor (db: Db) {
this.collection = db.collection('result_request')
}

async getFeedRequests (feedId: ObjectId) {
return (
await this.collection
.find({
feedId: feedId.toString()
})
.toArray()
).map(this.normalizeId)
}

async getLastResult (feedId: ObjectId) {
const lastResultRequest = await this.collection.findOne(
{
feedId: feedId.toString()
},
{
sort: {
timestamp: -1
},
collation: {
locale: 'en_US',
numericOrdering: true
}
}
)

return lastResultRequest?.result
}

async insert (resultRequest: Omit<ResultRequestDbObject, '_id'>) {
const response = await this.collection.insertOne(resultRequest)

return this.normalizeId(response.ops[0])
}

private normalizeId (resultRequest: ResultRequestDbObject) {
return { ...resultRequest, id: resultRequest._id }
}
}
11 changes: 7 additions & 4 deletions packages/api/src/resolvers.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { FeedRepository } from './repository/Feed'
import { PriceRequestRepository } from './repository/PriceRequest'
import { ResultRequestRepository } from './repository/ResultRequest'
type Context = {
feedRepository: FeedRepository
priceRequestRepository: PriceRequestRepository
resultRequestRepository: ResultRequestRepository
}

const resolvers = {
Expand All @@ -16,8 +16,11 @@ const resolvers = {
}
},
Feed: {
requests: async (parent, _args, { priceRequestRepository }: Context) => {
return await priceRequestRepository.getFeedRequests(parent.id)
requests: async (parent, _args, { resultRequestRepository }: Context) => {
return await resultRequestRepository.getFeedRequests(parent.id)
},
lastResult: async (parent, _args, { resultRequestRepository }: Context) => {
return await resultRequestRepository.getLastResult(parent.id)
}
}
}
Expand Down
31 changes: 15 additions & 16 deletions packages/api/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,47 +4,46 @@ import { DIRECTIVES } from '@graphql-codegen/typescript-mongodb'
import resolvers from './resolvers'
import { Db } from 'mongodb'
import { FeedRepository } from './repository/Feed'
import { PriceRequestRepository } from './repository/PriceRequest'
import { ResultRequestRepository } from './repository/ResultRequest'


// async function addSampleData(feedRepository: FeedRepository, priceRequestRepository: PriceRequestRepository) {
// async function addSampleData(feedRepository: FeedRepository, resultRequestRepository: ResultRequestRepository) {
// await feedRepository.collection.drop()
// await priceRequestRepository.collection.drop()
// await resultRequestRepository.collection.drop()

// const feed1 = await feedRepository.insert({
// address: "1",
// name: "btc/eur",
// requests: []
// })

// const priceRequest1 = await priceRequestRepository.insert({
// price: 1000.00,
// const resultRequest1 = await resultRequestRepository.insert({
// result: 1000.00,
// feedId: feed1._id.toString(),
// requestId: '1',
// timestamp: Date.now().toString(),
// })
// await feedRepository.addPriceRequest(feed1._id, priceRequest1._id)
// await feedRepository.addResultRequest(feed1._id, resultRequest1._id)

// const priceRequest2 = await priceRequestRepository.insert({
// price: 2000.00,
// const resultRequest2 = await resultRequestRepository.insert({
// result: 2000.00,
// feedId: feed1._id.toString(),
// requestId: '2',
// timestamp: Date.now().toString(),
// })
// await feedRepository.addPriceRequest(feed1._id, priceRequest2._id)
// await feedRepository.addResultRequest(feed1._id, resultRequest2._id)

// const feed2 = await feedRepository.insert({
// address: "2",
// name: "btc/usd",
// requests: []
// })
// const priceRequest3 = await priceRequestRepository.insert({
// price: 3000.00,
// const resultRequest3 = await resultRequestRepository.insert({
// result: 3000.00,
// feedId: feed2._id.toString(),
// requestId: '3',
// timestamp: Date.now().toString(),
// })
// await feedRepository.addPriceRequest(feed2._id, priceRequest3._id)
// await feedRepository.addResultRequest(feed2._id, resultRequest3._id)

// await feedRepository.insert({
// address: "3",
Expand All @@ -55,12 +54,12 @@ import { PriceRequestRepository } from './repository/PriceRequest'

export async function createServer (db: Db): Promise<ApolloServer> {
const feedRepository = new FeedRepository(db)
const priceRequestRepository = new PriceRequestRepository(db)
const resultRequestRepository = new ResultRequestRepository(db)

// addSampleData(feedRepository, priceRequestRepository)
// addSampleData(feedRepository, resultRequestRepository)

const context = () => {
return { feedRepository, priceRequestRepository }
return { feedRepository, resultRequestRepository }
}

const server = new ApolloServer({
Expand Down
7 changes: 4 additions & 3 deletions packages/api/src/typeDefs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@ const typeDefs = gql`
id: String! @id
name: String! @column
address: String! @column
requests: [PriceRequest]! @link
requests: [ResultRequest]! @link
lastResult: Float! @column
}

type PriceRequest @entity {
type ResultRequest @entity {
id: String! @id
feedId: String! @column
price: Float! @column
result: Float! @column
requestId: String! @column
timestamp: String! @column
# request: DataRequest @embedded
Expand Down
51 changes: 34 additions & 17 deletions packages/api/test/feeds.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ const state: {
server: null
}

describe('user', function () {
describe('feeds', function () {
beforeAll(async function () {
const ciUri= 'mongodb://localhost'
const ciUri = 'mongodb://localhost'
const mongoManager = new MongoManager()
const db = await mongoManager.start(process.env.CI ? ciUri : null)
const server = await createServer(db)
Expand Down Expand Up @@ -79,21 +79,37 @@ describe('user', function () {
const feedResponse = await state.mongoManager.db
.collection('feed')
.insertOne(feedExample)
const priceRequestExample = {
price: 1000.0,
const resultRequestExample1 = {
result: 1111.0,
feedId: feedResponse.ops[0]._id.toString(),
requestId: '1',
timestamp: Date.now().toString()
timestamp: '1623085320000'
}
const priceRequestResponse = await state.mongoManager.db
.collection('price_request')
.insertOne(priceRequestExample)
const resultRequestExample2 = {
result: 2222.0,
feedId: feedResponse.ops[0]._id.toString(),
requestId: '1',
timestamp: '1623085329000'
}
const resultRequestResponse1 = await state.mongoManager.db
.collection('result_request')
.insertOne(resultRequestExample1)
const resultRequestResponse2 = await state.mongoManager.db
.collection('result_request')
.insertOne(resultRequestExample2)

await state.mongoManager.db
.collection('feed')
.findOneAndUpdate(
{ _id: feedResponse.ops[0]._id },
{ $push: { requests: priceRequestResponse.ops[0]._id.toString() } },
{ $push: { requests: resultRequestResponse1.ops[0]._id.toString() } },
{ returnDocument: 'after' }
)
await state.mongoManager.db
.collection('feed')
.findOneAndUpdate(
{ _id: feedResponse.ops[0]._id },
{ $push: { requests: resultRequestResponse2.ops[0]._id.toString() } },
{ returnDocument: 'after' }
)

Expand All @@ -103,10 +119,11 @@ describe('user', function () {
id
address
name
lastResult
requests {
id
feedId
price
result
requestId
timestamp
error
Expand All @@ -120,26 +137,26 @@ describe('user', function () {
} = await state.testClient.query({
query: GET_FEEDS
})

expect(feeds.length).toBe(1)
expect(feeds[0]).toHaveProperty('address', feedExample.address)
expect(feeds[0]).toHaveProperty('name', feedExample.name)
expect(feeds[0].requests.length).toBe(1)
expect(feeds[0]).toHaveProperty('lastResult', resultRequestExample2.result)
expect(feeds[0].requests.length).toBe(2)
expect(feeds[0].requests[0]).toHaveProperty(
'feedId',
priceRequestExample.feedId
resultRequestExample1.feedId
)
expect(feeds[0].requests[0]).toHaveProperty(
'price',
priceRequestExample.price
'result',
resultRequestExample1.result
)
expect(feeds[0].requests[0]).toHaveProperty(
'requestId',
priceRequestExample.requestId
resultRequestExample1.requestId
)
expect(feeds[0].requests[0]).toHaveProperty(
'timestamp',
priceRequestExample.timestamp
resultRequestExample1.timestamp
)
expect(feeds[0].id).toBeTruthy()
})
Expand Down