feat: refresh route for worker

This commit is contained in:
GitBluub
2022-03-03 16:42:03 +01:00
parent fef97f2935
commit 403ee278b7
3 changed files with 39 additions and 12 deletions
+24 -2
View File
@@ -19,14 +19,16 @@ import Utils (UserAuth, uncurry3)
import Api.Pipeline (GetPipelineResponse, formatGetPipelineResponse, allPipelineHandler)
import Data.Aeson (FromJSON, ToJSON, defaultOptions, eitherDecode)
import Data.Aeson.TH (deriveJSON)
import Core.User (UserId(UserId), ExternalToken (ExternalToken))
import Core.User (UserId(UserId), ExternalToken (ExternalToken), Service)
import Control.Monad.IO.Class (MonadIO(liftIO))
import System.Environment.MrEnv (envAsString)
import Repository (getUserById', getWorkflow', getWorkflows', triggerPipeline', errorPipeline')
import Db.User (UserDB(userDBId, externalTokens))
import Data.Functor.Identity (Identity)
import Db.Reaction (Reaction)
import Repository.User (updateTokens, getTokensByUserId, delTokens)
import GHC.Generics (Generic)
import Data.Int (Int64)
import Data.Text (Text)
@@ -42,9 +44,16 @@ data GetPipelineWorkerResponse = GetPipelineWorkerResponse
newtype ErrorBody = ErrorBody { error :: Text }
data RefreshBody = RefreshBody
{ accessToken :: Text
, refreshToken :: Text
, expiresIn :: Int64
}
$(deriveJSON defaultOptions ''WorkerUserData)
$(deriveJSON defaultOptions ''GetPipelineWorkerResponse)
$(deriveJSON defaultOptions ''ErrorBody)
$(deriveJSON defaultOptions ''RefreshBody)
data WorkerAPI mode = WorkerAPI
{ get :: mode :- "workflow" :> Capture "id" PipelineId :>
@@ -55,6 +64,8 @@ data WorkerAPI mode = WorkerAPI
QueryParam "WORKER_API_KEY" String :> Get '[JSON] NoContent
, error :: mode :- "error" :> Capture "id" PipelineId :>
QueryParam "WORKER_API_KEY" String :> ReqBody '[JSON] ErrorBody :> Post '[JSON] NoContent
, refresh :: mode :- "auth" :> Capture "service" Service :> "refresh" :> Capture "id" UserId :>
QueryParam "WORKER_API_KEY" String :> ReqBody '[JSON] RefreshBody :> Post '[JSON] NoContent
}
deriving stock (Generic)
@@ -98,6 +109,16 @@ errorHandler pId (Just key) (ErrorBody msg) = do
else throwError err403
errorHandler _ _ _ = throwError err403
refreshHandler :: Service -> UserId -> Maybe String -> RefreshBody -> AppM NoContent
refreshHandler service uid (Just key) (RefreshBody at rt ex) = do
k <- liftIO $ envAsString "WORKER_API_KEY" ""
if k == key then do
updateTokens uid $ ExternalToken at rt ex service
return NoContent
else throwError err403
refreshHandler _ _ _ _ = throwError err403
workerHandler :: WorkerAPI (AsServerT AppM)
workerHandler =
WorkerAPI
@@ -105,4 +126,5 @@ workerHandler =
, all = allPipelineHandlerWorker
, trigger = triggerHandler
, error = errorHandler
}
, refresh = refreshHandler
}
+1 -1
View File
@@ -22,7 +22,7 @@ import Servant.Server.Experimental.Auth (AuthServerData)
import Servant.Auth.JWT (ToJWT, FromJWT)
newtype UserId = UserId {toInt64 :: Int64}
deriving newtype (DBEq, DBType, Eq, Show, Num, FromJSON, ToJSON)
deriving newtype (DBEq, DBType, Eq, Show, Num, FromJSON, ToJSON, FromHttpApiData)
deriving stock (Generic)
data Service = Github | Google | Spotify | Twitter | Discord | Anilist
+14 -9
View File
@@ -14,28 +14,33 @@ global.AbortController = AbortController;
const app = express()
const pipelineEvent = new EventEmitter();
app.put("/workflow/:id", req => {
app.put("/workflow/:id", (req, res) => {
console.log(`edit pipeline ${req.params.id}`);
fetch(`${process.env["WORKER_API_URL"]}/workflow/${req.params.id}?WORKER_API_KEY=${process.env["WORKER_API_KEY"]}`)
.then(res => {
pipelineEvent.emit("event", pipelineFromApi(res.json()));
});
.then(async res => {
pipelineEvent.emit("event", pipelineFromApi(await res.json()));
})
.catch(console.error);
res.send()
});
app.post("/workflow/:id", req => {
app.post("/workflow/:id", (req, res) => {
console.log(`new pipeline ${req.params.id}`);
fetch(`${process.env["WORKER_API_URL"]}/workflow/${req.params.id}?WORKER_API_KEY=${process.env["WORKER_API_KEY"]}`)
.then(res => {
pipelineEvent.emit("event", pipelineFromApi(res.json()));
});
.then(async res => {
pipelineEvent.emit("event", pipelineFromApi(await res.json()));
})
.catch(console.error);
res.send()
});
app.delete("/workflow/:id", req => {
app.delete("/workflow/:id", (req, res) => {
console.log(`delete pipeline ${req.params.id}`);
pipelineEvent.emit("event", {
id: req.params.id,
type: PipelineType.Never,
});
res.send()
});
app.listen(5000);