Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
danfunk committed Dec 12, 2023
1 parent c002e04 commit 96acc67
Show file tree
Hide file tree
Showing 9 changed files with 297 additions and 55 deletions.
36 changes: 34 additions & 2 deletions spiffworkflow-backend/src/spiffworkflow_backend/api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2395,6 +2395,7 @@ paths:
application/json:
schema:
$ref: "#/components/schemas/Workflow"

/message-models:
parameters:
- name: page
Expand All @@ -2417,7 +2418,7 @@ paths:
type: string
get:
tags:
- Message Models
- Messages
operationId: spiffworkflow_backend.routes.messages_controller.message_model_list
summary: Get a list of message models
responses:
Expand All @@ -2428,7 +2429,38 @@ paths:
schema:
$ref: "#/components/schemas/Workflow"


/correlation-keys:
parameters:
- name: page
in: query
required: false
description: The page number to return. Defaults to page 1.
schema:
type: integer
- name: per_page
in: query
required: false
description: The number of correlations to show per page. Defaults to page 10.
schema:
type: integer
- name: relative_location
in: query
required: false
description: The location of the correlation key relative to the root of the project, defaults to /
schema:
type: string
get:
tags:
- Messages
operationId: spiffworkflow_backend.routes.messages_controller.correlation_key_list
summary: Get a list of correlation_keys
responses:
"200":
description: A list of correlation_keys
content:
application/json:
schema:
$ref: "#/components/schemas/Workflow"

/messages:
parameters:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ class ReferenceType(SpiffEnum):
process = "process"
data_store = "data_store"
message = "message"
correlation_key = "correlation_key"


# SpecReference
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,18 @@
from spiffworkflow_backend.models.message_instance import MessageInstanceModel
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
from spiffworkflow_backend.models.process_instance import ProcessInstanceModelSchema
from spiffworkflow_backend.models.reference_cache import ReferenceCacheModel, ReferenceSchema
from spiffworkflow_backend.models.reference_cache import ReferenceCacheModel, ReferenceSchema, ReferenceType
from spiffworkflow_backend.services.message_service import MessageService
from spiffworkflow_backend.services.reference_cache_service import ReferenceCacheService


def message_model_list(
def reference_cache_list(
cache_type: str,
relative_location: str | None = None,
page: int = 1,
per_page: int = 100,
) -> flask.wrappers.Response:

query = ReferenceCacheModel.basic_query().filter_by(type="message")
query = ReferenceCacheModel.basic_query().filter_by(type=cache_type)
if relative_location:
locations = ReferenceCacheService.upsearch_locations(relative_location)
query = query.filter(ReferenceCacheModel.relative_location.in_(locations))
Expand All @@ -40,6 +40,33 @@ def message_model_list(
}
return make_response(jsonify(response_json), 200)


def message_model_list(
relative_location: str | None = None,
page: int = 1,
per_page: int = 100,
) -> flask.wrappers.Response:
return reference_cache_list(
cache_type=ReferenceType.message.value,
relative_location=relative_location,
page=page,
per_page=per_page,
)


def correlation_key_list(
relative_location: str | None = None,
page: int = 1,
per_page: int = 100,
) -> flask.wrappers.Response:
return reference_cache_list(
cache_type=ReferenceType.correlation_key.value,
relative_location=relative_location,
page=page,
per_page=per_page,
)


def message_instance_list(
process_instance_id: int | None = None,
page: int = 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,17 @@ def save_all_process_models(cls) -> list:
if "correlation_keys" in data:
for correlation_key in data["correlation_keys"]:
correlation_keys[correlation_key["id"]] = correlation_key["correlation_properties"]
reference_cache = ReferenceCacheModel.from_params(
correlation_key["id"],
correlation_key["id"],
ReferenceType.correlation_key.value,
'',
FileSystemService.relative_location(file),
correlation_key["correlation_properties"],
False,
)
ReferenceCacheService.add_unique_reference_cache_object(reference_objects,
reference_cache)

for message in data["messages"]:
properties = []
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def test_data_setup_service_finds_models(
self.copy_example_process_models()
DataSetupService.save_all_process_models()
cache = ReferenceCacheModel.query.filter(ReferenceCacheModel.type == 'process').all()
assert(len(cache) == 2)
assert(len(cache) == 1)

def test_data_setup_service_finds_messages(
self,
Expand Down Expand Up @@ -55,14 +55,20 @@ def test_data_setup_service_finds_messages(
assert message_map['basic_message'].relative_location == "1-basic-concepts"
assert message_map['basic_message'].properties == {'correlation_keys': [], 'correlations': []}

def test_data_setup_service_finds_correlation_keys (
self,
app: Flask,
client: FlaskClient,
with_db_and_bpmn_file_cleanup: None,

def test_data_setup_service_finds_correlations(
self,
app: Flask,
client: FlaskClient,
with_db_and_bpmn_file_cleanup: None,
) -> None:
self.copy_example_process_models()
DataSetupService.save_all_process_models()
cache = ReferenceCacheModel.query.filter(ReferenceCacheModel.type == 'message').all()
assert (len(cache) == 3)
message_map = {c.identifier: c for c in cache}
cache = ReferenceCacheModel.query.filter(ReferenceCacheModel.type == 'correlation_key').all()
assert(len(cache) == 2)
correlation_map = {c.identifier: c for c in cache}
assert ("order" in correlation_map)
assert ("franchise" in correlation_map)
assert (correlation_map['order'].properties == ['table_number', 'franchise_id'])
assert (correlation_map['franchise'].properties == ['franchise_id'])

Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,6 @@ export default function MessageInstanceList({ processInstanceId }: OwnProps) {
return (
<>
{breadcrumbElement}
{correlationsDisplayModal()}
<PaginationForTable
page={page}
perPage={perPage}
Expand Down
155 changes: 155 additions & 0 deletions spiffworkflow-frontend/src/components/messages/MessageModal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
import {
Form,
Modal,
Stack,
TextInput,
Checkbox,
Select,
SelectItem,
} from '@carbon/react';
import { useEffect, useState } from 'react';
import { ReferenceCache } from '../../interfaces';
import HttpService from '../../services/HttpService';

type OwnProps = {
messageModel: ReferenceCache;
open: boolean;
onClose: () => void;
};

export default function MessageModal({
messageModel,
open,
onClose,
}: OwnProps) {
const updatedModel: ReferenceCache = { ...messageModel };
const [identifierInvalid, setIdentifierInvalid] = useState<boolean>(false);
const [showCorrelations, setShowCorrelations] = useState<boolean>(false);
const [correlationKeys, setCorrelationKeys] = useState<any>({ results: [] });
const [correlationKey, setCorrelationKey] = useState<ReferenceCache | null>(
null
);

setShowCorrelations(messageModel.properties.correlations.length > 0);

useEffect(() => {
let queryParamString = `per_page=100&page=1`;
queryParamString += `&relative_location=${messageModel.relative_location}`;

const updateKeys = (result: any) => {
setCorrelationKeys(result);
result.results.forEach((key: any) => {
console.log("Has Key?", key.identifier, messageModel.properties.correlation_keys);
if (messageModel.properties.correlation_keys.includes(key.identifier)) {
console.log("Huston we have a match", key);
setCorrelationKey(key);
setShowCorrelations(true);
}
});
};

HttpService.makeCallToBackend({
path: `/correlation-keys?${queryParamString}`,
successCallback: updateKeys,
});
}, [messageModel]);

const onMessageNameChange = (event: any) => {
updatedModel.identifier = event.target.value;
setIdentifierInvalid(
updatedModel.identifier.length < 3 ||
!/^[a-z0-9_]+$/.test(updatedModel.identifier)
);
};

const correlationKeyOptions = () => {
return correlationKeys.results.map((key: any) => {
return <SelectItem value={key.identifier} text={key.identifier} />;
});
};

const onCorrelationKeySelected = (event: any) => {
correlationKeys.results.forEach((key: any) => {
if (key.identifier === event.target.value) {
console.log('Key updated', key);
setCorrelationKey(key);
}
});
};

const retrievalExpressionFields = () => {
console.log('Correlation Key', correlationKey, showCorrelations);
if (correlationKey && showCorrelations) {
const fields = correlationKey.properties.map((prop: any) => {
const label = `Extraction Expression for ${prop}`;
return (
<TextInput
id={prop}
name={prop}
invalid={identifierInvalid}
labelText={label}
defaultValue={prop}
// onChange={}
/>
);
});
return (
<div className={'retrievalExpressionsForm'}>
<h2>Retrieval Expressions:</h2>
The body of the message should be a JSON object that includes these properties. The value
of each property will be extracted from the message and used to correlate the message to a
running process.
{fields}
</div>
)
}
return null;
};

const createMessageForm = () => {
return (
<Form onSubmit={onClose}>
<Stack gap={5}>
<TextInput
id="message_name"
name="message_name"
placeholder="food_is_ready"
invalidText='Minimum of 3 letters, please use only letters and underscores, ie "food_is_ready"'
invalid={identifierInvalid}
labelText="Message Name*"
defaultValue={updatedModel.identifier}
onChange={onMessageNameChange}
/>
<Checkbox
id="show_correlations"
labelText="Correlate this message"
checked={showCorrelations}
helperText="Correlations are used to assure that messages are delivered only to those process
instances that are related. For example a process instance that prepares food for table 12 would
not receive a message about table 11, because it is CORRELATED to a specific table number."
/>
<Select
id="correlation_key"
labelText="Select a correlation"
onChange={onCorrelationKeySelected}
visible={showCorrelations}
>
{correlationKeyOptions()}
</Select>
{retrievalExpressionFields()}
</Stack>
</Form>
);
};

return (
<Modal
open={open}
onRequestClose={onClose}
modalHeading={`${messageModel.identifier}`}
modalLabel="Details"
>
{createMessageForm()}
</Modal>
);
}
Loading

0 comments on commit 96acc67

Please sign in to comment.