FEATURE: server side api

This commit is contained in:
ma-silva 2023-04-20 14:03:07 +08:00
parent cc195ae55a
commit 3fa5e96bfe
7 changed files with 155 additions and 0 deletions

32
server/app.ts Normal file
View File

@ -0,0 +1,32 @@
import 'reflect-metadata'
import 'dotenv/config'
import session from 'express-session'
import express, { Application } from 'express'
import { useExpressServer, useContainer } from 'routing-controllers'
import { Container } from 'typedi'
import path from 'path'
const port = 8085
const app: Application = express()
app.use(express.json())
app.use(
session({
secret: 'very secret',
resave: false,
saveUninitialized: true
})
)
useContainer(Container)
const server = useExpressServer(app, {
//routePrefix: '/api/v1',
routePrefix: '/api',
controllers: [path.join(__dirname + '/controllers/*.ts')],
middlewares: [path.join(__dirname + '/middlewares/*.ts')]
})
export const instance = server.listen(port)
console.log('Server running at http://localhost:' + port)
export default app

View File

@ -0,0 +1,14 @@
import { Controller, Req, Res, Get, UseBefore } from 'routing-controllers'
import { Request, Response } from 'express'
import { Service } from 'typedi'
import OauthAccessTokenMiddleware from '../middlewares/OauthAccessTokenMiddleware'
@Service()
@Controller()
@UseBefore(OauthAccessTokenMiddleware)
export default class CallbackController {
@Get('/callback')
callback(@Req() request: Request, @Res() response: Response): Response {
return response
}
}

View File

@ -0,0 +1,14 @@
import { Controller, Req, Res, Get, UseBefore } from 'routing-controllers'
import { Request, Response } from 'express'
import OauthRequestTokenMiddleware from '../middlewares/OauthRequestTokenMiddleware'
import { Service } from 'typedi'
@Service()
@Controller()
@UseBefore(OauthRequestTokenMiddleware)
export class ConnectController {
@Get('/connect')
connect(@Req() request: Request, @Res() response: Response): Response {
return response
}
}

View File

@ -0,0 +1,12 @@
import { Controller, Req, Res, Get } from 'routing-controllers'
import { Request, Response } from 'express'
import { Service } from 'typedi'
@Controller()
@Service()
export default class UserController {
@Get('/user')
getUser(@Req() request: Request, @Res() response: Response): Response {
return response.json('User list.')
}
}

View File

@ -0,0 +1,30 @@
import { ExpressMiddlewareInterface } from 'routing-controllers'
import { Response, Request } from 'express'
import { Service } from 'typedi'
import OauthInjectedService from '../services/OauthInjectedService'
@Service()
export default class OauthAccessTokenMiddleware implements ExpressMiddlewareInterface {
constructor(private oauthInjectedService: OauthInjectedService) {}
use(request: Request, response: Response): any {
const oauthService = this.oauthInjectedService
const consumer = oauthService.getConsumer()
const oauthVerifier = request.query.oauth_verifier
consumer.getOAuthAccessToken(
oauthService.requestTokenKey,
oauthService.requestTokenSecret,
oauthVerifier,
(error: any, oauthTokenKey: string, oauthTokenSecret: string) => {
if (error) {
console.log(error)
response.status(500).send('Error getting OAuth access token: ' + error)
} else {
response.redirect(
process.env.VITE_HOST + '?accessKey=' + oauthTokenKey + '&secret=' + oauthTokenSecret
)
}
}
)
}
}

View File

@ -0,0 +1,25 @@
import { ExpressMiddlewareInterface } from 'routing-controllers'
import { Response, Request } from 'express'
import { Service } from 'typedi'
import OauthInjectedService from '../services/OauthInjectedService'
@Service()
export default class OauthRequestTokenMiddleware implements ExpressMiddlewareInterface {
constructor(private oauthInjectedService: OauthInjectedService) {}
use(request: Request, response: Response): any {
const apiHost = process.env.VITE_API_HOST
const oauthService = this.oauthInjectedService
const consumer = oauthService.getConsumer()
consumer.getOAuthRequestToken((error: any, oauthTokenKey: string, oauthTokenSecret: string) => {
if (error) {
console.error(error)
response.status(500).send('Error getting OAuth request token: ' + error)
} else {
oauthService.requestTokenKey = oauthTokenKey
oauthService.requestTokenSecret = oauthTokenSecret
response.redirect(apiHost + '/oauth/authorize?oauth_token=' + oauthTokenKey)
}
})
}
}

View File

@ -0,0 +1,28 @@
import { Service } from 'typedi'
import oauth from 'oauth'
@Service()
export default class OauthInjectedService {
public requestTokenKey: string
public requestTokenSecret: string
private oauth: oauth.OAuth
constructor() {
const apiHost = process.env.VITE_API_HOST
const consumerKey = process.env.VITE_CONSUMER_KEY
const consumerSecret = process.env.VITE_CONSUMER_SECRET
const redirectUrl = process.env.VITE_REDIRECT_URL
this.oauth = new oauth.OAuth(
apiHost + '/oauth/initiate',
apiHost + '/oauth/token',
consumerKey,
consumerSecret,
'1.0',
redirectUrl,
'HMAC-SHA1'
)
}
getConsumer(): oauth.OAuth {
return this.oauth
}
}