diff --git a/main.py b/main.py index 56bde7c..f230a30 100644 --- a/main.py +++ b/main.py @@ -1,11 +1,13 @@ -from typing import Union -import uuid -from fastapi import FastAPI -import json from datetime import datetime, timezone from dulwich import porcelain -from dulwich.objects import Blob from dulwich.repo import MemoryRepo +from fastapi import FastAPI +from fastapi.responses import JSONResponse +import json +import uuid + +class SCIMResponse(JSONResponse): + media_type = "application/scim+json" #Clone repo into memory local_repo = MemoryRepo() @@ -14,12 +16,31 @@ fetch_result = porcelain.fetch(local_repo, "ssh://git@platform.sunet.se:22022/mi local_repo.refs[b"refs/heads/main"] = fetch_result.refs[b"refs/heads/main"] last_tree = local_repo[local_repo[b"HEAD"].tree] -app = FastAPI() +app = FastAPI(default_response_class=SCIMResponse) +def list_below(store, treeid, base): + for name, mode, sha in store[treeid.id].iteritems(): + if not base: + base = b"" + if name == base: + for name, mode, sha in store[sha].iteritems(): + yield name, mode, sha + @app.get("/") def read_root(): return {"Hello": "World"} +@app.get("/v2/Users") +def read_all_user(): + all_entries = list(list_below(local_repo, last_tree, b'Users')) + response = {} + response["schemas"] = ("urn:ietf:params:scim:api:messages:2.0:ListResponse") + response["totalResults"] = len(all_entries) + response['Resources'] = [] + for entry in all_entries: + response['Resources'].append(read_user(entry[0].split(b'.json')[0].decode('utf-8'))) + return response + @app.get("/v2/Users/{item_id}") def read_user(item_id: uuid.UUID): try: