mirror of
https://github.com/zoriya/Aeris.git
synced 2026-06-02 10:57:31 +00:00
feat: refresh route for worker
This commit is contained in:
+24
-2
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user