Skip to content
This repository has been archived by the owner on May 19, 2023. It is now read-only.

Commit

Permalink
feat: adds channel filter to sold domains
Browse files Browse the repository at this point in the history
  • Loading branch information
jurajpiar committed Jul 24, 2020
1 parent b807b8d commit 8145b86
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 80 deletions.
4 changes: 2 additions & 2 deletions src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export const services = {
[SupportedServices.RNS]: rns
}

export async function appFactory(): Promise<Application> {
export async function appFactory (): Promise<Application> {
const app: Application = express(feathers())

logger.verbose('Current configuration: ', config)
Expand Down Expand Up @@ -68,7 +68,7 @@ export async function appFactory(): Promise<Application> {

// Log errors in hooks
app.hooks({
error(context) {
error (context) {
logger.error(`Error in '${context.path}' service method '${context.method}'`, context.error.stack)
}
})
Expand Down
61 changes: 14 additions & 47 deletions src/services/authentication.ts
Original file line number Diff line number Diff line change
@@ -1,66 +1,33 @@
import { ServiceAddons, Params } from '@feathersjs/feathers';
import { AuthenticationService, JWTStrategy, AuthenticationResult, AuthenticationBaseStrategy } from '@feathersjs/authentication';
import { Application } from '../definitions';
import { ServiceAddons, Params } from '@feathersjs/feathers'
import { AuthenticationService, AuthenticationBaseStrategy, AuthenticationRequest } from '@feathersjs/authentication'
import { Application } from '../definitions'

declare module '../definitions' {
interface ServiceTypes {
'authentication': AuthenticationService & ServiceAddons<any>;
'authentication': AuthenticationService & ServiceAddons<any>
}
}

class MyJWT extends JWTStrategy {
async authenticate(authentication: AuthenticationResult, params: Params) {
console.log('MyJWT -> authenticate------------------------------')
console.log(authentication)
console.log('------------------------------')
console.log(params)
console.log('------------------------------')
return super.authenticate(authentication, params)
}
}
class AnonymousStrategy extends AuthenticationBaseStrategy {
async authenticate(authentication, params) {
authenticate(authentication: AuthenticationRequest, params: Params) {
const channels: [] = authentication.channels
console.log('AnonymousStrategy -> authenticate------------------------------')
console.log(authentication)
console.log('------------------------------')
params.connection.ownerAddress = authentication.ownerAddress
channels.forEach(channel => {
this.app?.channel(channel).join(params.connection)
});
console.log('this.app.channels:', this.app.channels)
console.log('------------------------------')
return {
anonymous: true
}
}
}

class MyAuthService extends AuthenticationService {
async getPayload(authResult, params) {
// Call original `getPayload` first
const payload = await super.getPayload(authResult, params);
const { user } = authResult;
})

if (user && user.permissions) {
payload.permissions = user.permissions;
}

return payload;
return Promise.resolve({ anonymous: true })
}
}

export default function (app: Application) {
const authentication = new MyAuthService(app as any) //FIXME: remove `as any`
const authentication = new AuthenticationService(app as any)

app.set('authentication', {
"secret": "8a58b86565c23c9ea90",
"entity": null,
"authStrategies": ["anonymous"],
secret: '8a58b86565c23c9ea90',
entity: null,
authStrategies: ['anonymous']
})

authentication.register('anonymous', new AnonymousStrategy());
// authentication.register('jwt', new MyJWT());

app.use('/authentication', authentication);
}
authentication.register('anonymous', new AnonymousStrategy())
app.use('/authentication', authentication)
}
21 changes: 11 additions & 10 deletions src/services/rns/rns.channels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,25 @@ export default function (app: Application) {
}
app.on('connection', (connection: any) => {
app.channel('offers').join(connection)
// app.channel('domains').join(connection)
app.channel('sold').join(connection)
})

app.service(ServiceAddresses.RNS_DOMAINS).publish((data, context) => {
// Filter the channels to only authenticated
return app.channel(`domains`)
app.service(ServiceAddresses.RNS_DOMAINS).publish((data) => {
return app.channel('domains')
.filter(connection => {
const connectedAccount: string = connection.ownerAddress
const dataAccount: string = data.ownerAddress

return connectedAccount && dataAccount && connectedAccount.toLowerCase() === dataAccount.toLowerCase()
})
})
app.service(ServiceAddresses.RNS_SOLD).publish((data) => {
return app.channel('domains')
.filter(connection => {
const connectedAccount: string = connection.ownerAddress
const dataAccount: string = data.ownerAddress
console.log('----------------------')
console.log('rns.channels.ts -> domains publish -> connectedAccount:', connectedAccount)
console.log('rns.channels.ts -> domains publish -> dataAccount:', dataAccount)
console.log('----------------------')
return connectedAccount && dataAccount && connectedAccount.toLowerCase() === dataAccount.toLowerCase()
})
})
app.service(ServiceAddresses.RNS_OFFERS).publish(() => app.channel('offers'))
// app.service(ServiceAddresses.RNS_DOMAINS).publish(() => app.channel('domains'))
app.service(ServiceAddresses.RNS_SOLD).publish(() => app.channel('sold'))
}
61 changes: 40 additions & 21 deletions src/services/rns/rns.processor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@ import Domain from './models/domain.model'
import DomainExpiration from './models/expiration.model'
import DomainOwner from './models/owner.model'
import Transfer from './models/transfer.model'
import SoldDomain from './models/sold-domain.model'

async function transferHandler(logger: Logger, eventData: EventData, eth: Eth, services: RnsServices): Promise<void> {
async function transferHandler (logger: Logger, eventData: EventData, eth: Eth, services: RnsServices): Promise<void> {
const tokenId = Utils.numberToHex(eventData.returnValues.tokenId)
const ownerAddress = eventData.returnValues.to.toLowerCase()

Expand Down Expand Up @@ -41,7 +42,7 @@ async function transferHandler(logger: Logger, eventData: EventData, eth: Eth, s
}

if (domainsService.emit) {
domainsService.emit('patched', { tokenId, })
domainsService.emit('patched', { tokenId })
}
}
}
Expand Down Expand Up @@ -86,7 +87,7 @@ async function transferHandler(logger: Logger, eventData: EventData, eth: Eth, s
}
}

async function expirationChangedHandler(logger: Logger, eventData: EventData, _: Eth, services: RnsServices): Promise<void> {
async function expirationChangedHandler (logger: Logger, eventData: EventData, _: Eth, services: RnsServices): Promise<void> {
// event ExpirationChanged(uint256 tokenId, uint expirationTime);

const tokenId = Utils.numberToHex(eventData.returnValues.tokenId)
Expand Down Expand Up @@ -119,7 +120,7 @@ async function expirationChangedHandler(logger: Logger, eventData: EventData, _:
}
}

async function nameChangedHandler(logger: Logger, eventData: EventData, _: Eth, services: RnsServices): Promise<void> {
async function nameChangedHandler (logger: Logger, eventData: EventData, _: Eth, services: RnsServices): Promise<void> {
const name = eventData.returnValues.name
const domainsService = services.domains

Expand All @@ -137,7 +138,7 @@ async function nameChangedHandler(logger: Logger, eventData: EventData, _: Eth,
}
}

async function tokenPlacedHandler(logger: Logger, eventData: EventData, eth: Eth, services: RnsServices): Promise<void> {
async function tokenPlacedHandler (logger: Logger, eventData: EventData, eth: Eth, services: RnsServices): Promise<void> {
// event TokenPlaced(uint256 indexed tokenId, address indexed paymentToken, uint256 cost);

const transactionHash = eventData.transactionHash
Expand Down Expand Up @@ -174,7 +175,7 @@ async function tokenPlacedHandler(logger: Logger, eventData: EventData, eth: Eth
logger.info(`TokenPlaced event: ${tokenId} created`)
}

async function tokenUnplacedHandler(logger: Logger, eventData: EventData, eth: Eth, services: RnsServices): Promise<void> {
async function tokenUnplacedHandler (logger: Logger, eventData: EventData, eth: Eth, services: RnsServices): Promise<void> {
// event TokenUnplaced(uint256 indexed tokenId);
const tokenId = Utils.numberToHex(eventData.returnValues.tokenId)
const storedOffer = await DomainOffer.findOne({ where: { tokenId } })
Expand All @@ -188,29 +189,47 @@ async function tokenUnplacedHandler(logger: Logger, eventData: EventData, eth: E
}
}

async function tokenSoldHandler(logger: Logger, eventData: EventData, eth: Eth, services: RnsServices): Promise<void> {
// event TokenSold(uint256 indexed tokenId);

const transactionHash = eventData.transactionHash
async function tokenSoldHandler (
logger: Logger,
eventData: EventData,
eth: Eth,
{ sold: soldService, offers: offersService }: RnsServices
): Promise<void> {
const {
transactionHash,
blockNumber
} = eventData
const tokenId = Utils.numberToHex(eventData.returnValues.tokenId)
const domainOffer = await DomainOffer.findOne({ where: { tokenId } })

if (domainOffer) {
logger.info(`Found last offer for ${tokenId}`)
const soldService = services.sold

const soldDomain = await soldService.create({
const {
ownerAddress,
price,
priceString,
paymentToken
} = domainOffer

const soldDomain = await SoldDomain.create({
id: transactionHash,
tokenId: tokenId,
price: domainOffer.price,
priceString: domainOffer.priceString,
paymentToken: domainOffer.paymentToken,
soldDate: await getBlockDate(eth, eventData.blockNumber)
tokenId,
price,
priceString,
paymentToken,
soldDate: await getBlockDate(eth, blockNumber)
})

if (soldDomain) {
const offersService = services.offers
if (soldService.emit) {
soldService.emit('created', { tokenId, ownerAddress })
}

await offersService.remove(domainOffer.offerId)

if (offersService.emit) {
offersService.emit('created', { tokenId, ownerAddress })
}
logger.info(`TokenSold event: Sold Domain ${tokenId} in transaction ${transactionHash}`)
} else {
logger.info(`TokenSold event: ${tokenId} not updated`)
Expand All @@ -227,11 +246,11 @@ const commands = {
TokenSold: tokenSoldHandler
}

function isValidEvent(value: string): value is keyof typeof commands {
function isValidEvent (value: string): value is keyof typeof commands {
return value in commands
}

export default function rnsProcessorFactory(logger: Logger, eth: Eth, services: RnsServices) {
export default function rnsProcessorFactory (logger: Logger, eth: Eth, services: RnsServices) {
return async function (eventData: EventData): Promise<void> {
if (isValidEvent(eventData.event)) {
logger.info(`Processing event ${eventData.event}`)
Expand Down

0 comments on commit 8145b86

Please sign in to comment.