Upsearch api (#1259)

* Run partial tests, add sqlite var

* Add upsearch api

* Getting ./bin/pyl to pass

* Getting ./bin/pyl to pass

* Clean up fixtures

* Revert this change

* PR feedback - use actual schema for api.yml

* Hopefully fix the permissions
This commit is contained in:
jbirddog 2024-03-26 10:56:24 -04:00 committed by GitHub
parent f8a104cb2d
commit e8d2396b38
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 85 additions and 7 deletions

View File

@ -20,6 +20,9 @@ IN_FRONTEND ?= $(DOCKER_COMPOSE) run $(FRONTEND_CONTAINER)
SPIFFWORKFLOW_BACKEND_ENV ?= local_development
BACKEND_SQLITE_FILE ?= src/instance/db_$(SPIFFWORKFLOW_BACKEND_ENV).sqlite3
JUST ?=
YML_FILES := -f docker-compose.yml \
-f $(BACKEND_DEV_OVERLAY) \
-f $(FRONTEND_DEV_OVERLAY) \
@ -67,17 +70,17 @@ be-sh:
$(IN_BACKEND) /bin/bash
be-sqlite:
@if [ ! -f "$(BACKEND_CONTAINER)/src/instance/db_$(SPIFFWORKFLOW_BACKEND_ENV).sqlite3" ]; then \
echo "SQLite database file does not exist: $(BACKEND_CONTAINER)/src/instance/db_$(SPIFFWORKFLOW_BACKEND_ENV).sqlite3"; \
@if [ ! -f "$(BACKEND_CONTAINER)/$(BACKEND_SQLITE_FILE)" ]; then \
echo "SQLite database file does not exist: $(BACKEND_CONTAINER)/$(BACKEND_SQLITE_FILE)"; \
exit 1; \
fi
$(IN_BACKEND) sqlite3 src/instance/db_$(SPIFFWORKFLOW_BACKEND_ENV).sqlite3
$(IN_BACKEND) sqlite3 $(BACKEND_SQLITE_FILE)
be-tests: be-clear-log-file
$(IN_BACKEND) poetry run pytest
$(IN_BACKEND) poetry run pytest tests/spiffworkflow_backend/$(JUST)
be-tests-par: be-clear-log-file
$(IN_BACKEND) poetry run pytest -n auto -x --random-order
$(IN_BACKEND) poetry run pytest -n auto -x --random-order tests/spiffworkflow_backend/$(JUST)
fe-lint-fix:
$(IN_FRONTEND) npm run lint:fix

View File

@ -457,6 +457,27 @@ paths:
schema:
$ref: "#/components/schemas/ProcessGroup"
/upsearch-locations:
parameters:
- name: location
in: query
required: false
description: The location to perform the upsearch
schema:
type: string
get:
operationId: spiffworkflow_backend.routes.upsearch_controller.upsearch_locations
summary: Returns upsearch locations for the given location
tags:
- Upsearch
responses:
"200":
description: Upsearch Locations.
content:
application/json:
schema:
$ref: "#/components/schemas/Locations"
/process-models:
parameters:
- name: process_group_identifier
@ -3159,6 +3180,10 @@ components:
ok:
type: boolean
example: true
Locations:
properties:
locations:
type: array
User:
properties:
uid:

View File

@ -0,0 +1,14 @@
from typing import Any
from flask import jsonify
from flask import make_response
from spiffworkflow_backend.services.upsearch_service import UpsearchService
def upsearch_locations(
location: str | None,
) -> Any:
upsearch_locations = UpsearchService.upsearch_locations(location)
return make_response(jsonify({"locations": upsearch_locations}), 200)

View File

@ -542,6 +542,8 @@ class AuthorizationService:
permissions_to_assign.append(PermissionToAssign(permission="read", target_uri="/script-assist/enabled"))
permissions_to_assign.append(PermissionToAssign(permission="create", target_uri="/script-assist/process-message"))
permissions_to_assign.append(PermissionToAssign(permission="read", target_uri="/upsearch-locations"))
for permission in ["create", "read", "update", "delete"]:
permissions_to_assign.append(PermissionToAssign(permission=permission, target_uri="/process-instances/reports/*"))
permissions_to_assign.append(PermissionToAssign(permission=permission, target_uri="/public/*"))

View File

@ -3,8 +3,8 @@ import os
class UpsearchService:
@classmethod
def upsearch_locations(cls, process_model_identifier: str) -> list[str]:
location = process_model_identifier
def upsearch_locations(cls, process_model_identifier: str | None) -> list[str]:
location = process_model_identifier or ""
locations = []
while location != "":

View File

@ -0,0 +1,33 @@
import pytest
from flask.app import Flask
from flask.testing import FlaskClient
from spiffworkflow_backend.models.user import UserModel
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
class TestUpsearchControllerController(BaseTest):
@pytest.mark.parametrize(
"location,expected",
[
("a/b/c/d", ["a/b/c/d", "a/b/c", "a/b", "a", ""]),
("a", ["a", ""]),
("", [""]),
],
)
def test_return_upsearch_locations_for_path(
self,
app: Flask,
client: FlaskClient,
with_db_and_bpmn_file_cleanup: None,
with_super_admin_user: UserModel,
location: str,
expected: list[str],
) -> None:
response = client.get(
f"/v1.0/upsearch-locations?location={location}", headers=self.logged_in_headers(with_super_admin_user)
)
assert response.status_code == 200
assert "locations" in response.json
assert response.json["locations"] == expected

View File

@ -474,6 +474,7 @@ class TestAuthorizationService(BaseTest):
("/user-groups/for-current-user", "read"),
("/users/exists/by-username", "create"),
("/users/search", "read"),
("/upsearch-locations", "read"),
]
)