strapi-plugin-i-relate-to-this 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/index.js +31 -19
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +31 -19
- package/dist/admin/index.mjs.map +1 -1
- package/dist/server/index.js +5 -10
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +5 -10
- package/dist/server/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/admin/index.js
CHANGED
|
@@ -2,29 +2,32 @@
|
|
|
2
2
|
const jsxRuntime = require("react/jsx-runtime");
|
|
3
3
|
const react = require("react");
|
|
4
4
|
const reactIntl = require("react-intl");
|
|
5
|
-
const reactRouterDom = require("react-router-dom");
|
|
6
5
|
const designSystem = require("@strapi/design-system");
|
|
7
6
|
const admin = require("@strapi/strapi/admin");
|
|
7
|
+
const reactRouterDom = require("react-router-dom");
|
|
8
8
|
const ConditionalTooltip = ({ isShown, label, children }) => {
|
|
9
9
|
if (isShown) {
|
|
10
10
|
return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tooltip, { label, children });
|
|
11
11
|
}
|
|
12
12
|
return children;
|
|
13
13
|
};
|
|
14
|
-
const List = (
|
|
14
|
+
const List = ({
|
|
15
|
+
model,
|
|
16
|
+
activeTab,
|
|
17
|
+
// draft / published
|
|
18
|
+
document
|
|
19
|
+
}) => {
|
|
20
|
+
const { documentId, id } = document || {};
|
|
15
21
|
const { formatMessage } = reactIntl.useIntl();
|
|
16
|
-
const { id, slug } = reactRouterDom.useParams();
|
|
17
|
-
const [params] = reactRouterDom.useSearchParams();
|
|
18
22
|
const { toggleNotification } = admin.useNotification();
|
|
19
23
|
const [items, setItems] = react.useState(null);
|
|
20
24
|
const [loaded, setLoaded] = react.useState(false);
|
|
21
|
-
const status = params.get("status") || "draft";
|
|
22
25
|
const getter = react.useCallback(async () => {
|
|
23
26
|
const { get } = admin.getFetchClient();
|
|
24
27
|
let response;
|
|
25
|
-
const endpoint = `/i-relate-to-this
|
|
28
|
+
const endpoint = `/i-relate-to-this/${model}/${id}/${documentId}/${activeTab}`;
|
|
26
29
|
try {
|
|
27
|
-
response = await get(endpoint
|
|
30
|
+
response = await get(endpoint);
|
|
28
31
|
} catch (error) {
|
|
29
32
|
return toggleNotification({
|
|
30
33
|
type: "warning",
|
|
@@ -37,22 +40,31 @@ const List = () => {
|
|
|
37
40
|
setItems(response.data.items);
|
|
38
41
|
setLoaded(true);
|
|
39
42
|
return null;
|
|
40
|
-
}, [
|
|
43
|
+
}, [
|
|
44
|
+
model,
|
|
45
|
+
id,
|
|
46
|
+
documentId,
|
|
47
|
+
activeTab,
|
|
48
|
+
toggleNotification,
|
|
49
|
+
formatMessage,
|
|
50
|
+
setItems
|
|
51
|
+
]);
|
|
41
52
|
react.useEffect(() => {
|
|
42
|
-
|
|
53
|
+
setItems(null);
|
|
54
|
+
if (documentId) {
|
|
43
55
|
getter();
|
|
44
56
|
}
|
|
45
|
-
}, [
|
|
57
|
+
}, [documentId, getter, setItems]);
|
|
46
58
|
if (!loaded) {
|
|
47
59
|
return null;
|
|
48
60
|
}
|
|
49
|
-
if (!items) {
|
|
50
|
-
return
|
|
61
|
+
if (!items || Object.keys(items).length === 0) {
|
|
62
|
+
return "No relations found";
|
|
51
63
|
}
|
|
52
64
|
return Object.entries(items).map(([contentTypeTitle, entries]) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
53
65
|
/* @__PURE__ */ jsxRuntime.jsx("h2", { style: { paddingBottom: "0.5rem" }, children: contentTypeTitle }),
|
|
54
66
|
entries.map(({
|
|
55
|
-
documentId,
|
|
67
|
+
documentId: documentId2,
|
|
56
68
|
title,
|
|
57
69
|
uid,
|
|
58
70
|
isPublished
|
|
@@ -61,19 +73,19 @@ const List = () => {
|
|
|
61
73
|
{
|
|
62
74
|
variant: !isPublished ? "danger" : "tertiary",
|
|
63
75
|
tag: reactRouterDom.Link,
|
|
64
|
-
to: { pathname: `/content-manager/collection-types/${uid}/${
|
|
76
|
+
to: { pathname: `/content-manager/collection-types/${uid}/${documentId2}` },
|
|
65
77
|
children: [
|
|
66
78
|
!isPublished && "⚠",
|
|
67
79
|
" ",
|
|
68
|
-
title ||
|
|
80
|
+
title || documentId2
|
|
69
81
|
]
|
|
70
82
|
}
|
|
71
|
-
) }) },
|
|
72
|
-
] }));
|
|
83
|
+
) }) }, documentId2))
|
|
84
|
+
] }, contentTypeTitle));
|
|
73
85
|
};
|
|
74
|
-
const Panel = (
|
|
86
|
+
const Panel = (props) => ({
|
|
75
87
|
title: "Relations to this entry",
|
|
76
|
-
content: /* @__PURE__ */ jsxRuntime.jsx(List, {})
|
|
88
|
+
content: /* @__PURE__ */ jsxRuntime.jsx(List, { ...props })
|
|
77
89
|
});
|
|
78
90
|
const index = {
|
|
79
91
|
bootstrap(app) {
|
package/dist/admin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../admin/src/components/list.jsx","../../admin/src/components/panel.jsx","../../admin/src/index.js"],"sourcesContent":["import React, { useEffect, useCallback, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport {
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../admin/src/components/list.jsx","../../admin/src/components/panel.jsx","../../admin/src/index.js"],"sourcesContent":["import React, { useEffect, useCallback, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { Button, Tooltip } from '@strapi/design-system';\nimport {\n getFetchClient,\n useNotification,\n} from '@strapi/strapi/admin';\nimport { Link } from 'react-router-dom';\n\nconst useThisCode = true;\n\nconst ConditionalTooltip = ({ isShown, label, children }) => {\n if (isShown) {\n return <Tooltip label={label}>{children}</Tooltip>;\n }\n\n return children;\n};\n\nconst List = ({\n model,\n activeTab, // draft / published\n document,\n}) => {\n const { documentId, id } = document || {}; // support singleTypes\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const [items, setItems] = useState(null);\n const [loaded, setLoaded] = useState(false);\n\n const getter = useCallback(async () => {\n const { get } = getFetchClient();\n let response;\n const endpoint = `/i-relate-to-this/${model}/${id}/${documentId}/${activeTab}`;\n try {\n response = await get(endpoint);\n } catch (error) {\n return toggleNotification({\n type: 'warning',\n message: formatMessage({\n id: 'Failed to load list',\n defaultMessage: error,\n }),\n });\n }\n setItems(response.data.items);\n setLoaded(true);\n return null;\n }, [\n model,\n id,\n documentId,\n activeTab,\n toggleNotification,\n formatMessage,\n setItems,\n ]);\n\n useEffect(() => {\n // single types don't have an documentId\n // on create there are never relations\n setItems(null);\n if (useThisCode && documentId) {\n getter();\n }\n }, [documentId, getter, setItems]);\n\n if (!useThisCode) {\n return null;\n }\n\n if (!loaded) {\n return null;\n }\n\n if (!items || Object.keys(items).length === 0) {\n return 'No relations found';\n }\n\n return Object.entries(items).map(([contentTypeTitle, entries]) => (\n <div key={contentTypeTitle}>\n <h2 style={{ paddingBottom: '0.5rem' }}>{contentTypeTitle}</h2>\n {entries.map(({\n documentId,\n title,\n uid,\n isPublished,\n }) => (\n <div key={documentId} style={{ paddingBottom: '0.5rem' }}>\n <ConditionalTooltip isShown={!isPublished} label={`Current entry is not linked to the published version of ${title}, please publish ${title} to publish the relation`}>\n <Button\n variant={!isPublished ? 'danger' : 'tertiary'}\n tag={Link}\n to={{ pathname: `/content-manager/collection-types/${uid}/${documentId}` }}\n >\n {!isPublished && '⚠'} {title || documentId}\n </Button>\n </ConditionalTooltip>\n </div>\n ))}\n </div>\n ));\n};\n\nexport default List;\n","import List from \"./list\";\n\nconst Panel = (props) => ({\n title: 'Relations to this entry',\n content: <List {...props} />,\n});\n\nexport default Panel;","import Panel from './components/panel';\n\nexport default {\n bootstrap(app) {\n // execute some bootstrap code\n app.getPlugin('content-manager').apis.addEditViewSidePanel([Panel]);\n },\n register() {}\n};\n"],"names":["jsx","Tooltip","useIntl","useNotification","useState","useCallback","getFetchClient","useEffect","jsxs","documentId","Button","Link"],"mappings":"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"}
|
package/dist/admin/index.mjs
CHANGED
|
@@ -1,29 +1,32 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useCallback, useEffect } from "react";
|
|
3
3
|
import { useIntl } from "react-intl";
|
|
4
|
-
import { useParams, useSearchParams, Link } from "react-router-dom";
|
|
5
4
|
import { Button, Tooltip } from "@strapi/design-system";
|
|
6
5
|
import { useNotification, getFetchClient } from "@strapi/strapi/admin";
|
|
6
|
+
import { Link } from "react-router-dom";
|
|
7
7
|
const ConditionalTooltip = ({ isShown, label, children }) => {
|
|
8
8
|
if (isShown) {
|
|
9
9
|
return /* @__PURE__ */ jsx(Tooltip, { label, children });
|
|
10
10
|
}
|
|
11
11
|
return children;
|
|
12
12
|
};
|
|
13
|
-
const List = (
|
|
13
|
+
const List = ({
|
|
14
|
+
model,
|
|
15
|
+
activeTab,
|
|
16
|
+
// draft / published
|
|
17
|
+
document
|
|
18
|
+
}) => {
|
|
19
|
+
const { documentId, id } = document || {};
|
|
14
20
|
const { formatMessage } = useIntl();
|
|
15
|
-
const { id, slug } = useParams();
|
|
16
|
-
const [params] = useSearchParams();
|
|
17
21
|
const { toggleNotification } = useNotification();
|
|
18
22
|
const [items, setItems] = useState(null);
|
|
19
23
|
const [loaded, setLoaded] = useState(false);
|
|
20
|
-
const status = params.get("status") || "draft";
|
|
21
24
|
const getter = useCallback(async () => {
|
|
22
25
|
const { get } = getFetchClient();
|
|
23
26
|
let response;
|
|
24
|
-
const endpoint = `/i-relate-to-this
|
|
27
|
+
const endpoint = `/i-relate-to-this/${model}/${id}/${documentId}/${activeTab}`;
|
|
25
28
|
try {
|
|
26
|
-
response = await get(endpoint
|
|
29
|
+
response = await get(endpoint);
|
|
27
30
|
} catch (error) {
|
|
28
31
|
return toggleNotification({
|
|
29
32
|
type: "warning",
|
|
@@ -36,22 +39,31 @@ const List = () => {
|
|
|
36
39
|
setItems(response.data.items);
|
|
37
40
|
setLoaded(true);
|
|
38
41
|
return null;
|
|
39
|
-
}, [
|
|
42
|
+
}, [
|
|
43
|
+
model,
|
|
44
|
+
id,
|
|
45
|
+
documentId,
|
|
46
|
+
activeTab,
|
|
47
|
+
toggleNotification,
|
|
48
|
+
formatMessage,
|
|
49
|
+
setItems
|
|
50
|
+
]);
|
|
40
51
|
useEffect(() => {
|
|
41
|
-
|
|
52
|
+
setItems(null);
|
|
53
|
+
if (documentId) {
|
|
42
54
|
getter();
|
|
43
55
|
}
|
|
44
|
-
}, [
|
|
56
|
+
}, [documentId, getter, setItems]);
|
|
45
57
|
if (!loaded) {
|
|
46
58
|
return null;
|
|
47
59
|
}
|
|
48
|
-
if (!items) {
|
|
49
|
-
return
|
|
60
|
+
if (!items || Object.keys(items).length === 0) {
|
|
61
|
+
return "No relations found";
|
|
50
62
|
}
|
|
51
63
|
return Object.entries(items).map(([contentTypeTitle, entries]) => /* @__PURE__ */ jsxs("div", { children: [
|
|
52
64
|
/* @__PURE__ */ jsx("h2", { style: { paddingBottom: "0.5rem" }, children: contentTypeTitle }),
|
|
53
65
|
entries.map(({
|
|
54
|
-
documentId,
|
|
66
|
+
documentId: documentId2,
|
|
55
67
|
title,
|
|
56
68
|
uid,
|
|
57
69
|
isPublished
|
|
@@ -60,19 +72,19 @@ const List = () => {
|
|
|
60
72
|
{
|
|
61
73
|
variant: !isPublished ? "danger" : "tertiary",
|
|
62
74
|
tag: Link,
|
|
63
|
-
to: { pathname: `/content-manager/collection-types/${uid}/${
|
|
75
|
+
to: { pathname: `/content-manager/collection-types/${uid}/${documentId2}` },
|
|
64
76
|
children: [
|
|
65
77
|
!isPublished && "⚠",
|
|
66
78
|
" ",
|
|
67
|
-
title ||
|
|
79
|
+
title || documentId2
|
|
68
80
|
]
|
|
69
81
|
}
|
|
70
|
-
) }) },
|
|
71
|
-
] }));
|
|
82
|
+
) }) }, documentId2))
|
|
83
|
+
] }, contentTypeTitle));
|
|
72
84
|
};
|
|
73
|
-
const Panel = (
|
|
85
|
+
const Panel = (props) => ({
|
|
74
86
|
title: "Relations to this entry",
|
|
75
|
-
content: /* @__PURE__ */ jsx(List, {})
|
|
87
|
+
content: /* @__PURE__ */ jsx(List, { ...props })
|
|
76
88
|
});
|
|
77
89
|
const index = {
|
|
78
90
|
bootstrap(app) {
|
package/dist/admin/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../admin/src/components/list.jsx","../../admin/src/components/panel.jsx","../../admin/src/index.js"],"sourcesContent":["import React, { useEffect, useCallback, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport {
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../admin/src/components/list.jsx","../../admin/src/components/panel.jsx","../../admin/src/index.js"],"sourcesContent":["import React, { useEffect, useCallback, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { Button, Tooltip } from '@strapi/design-system';\nimport {\n getFetchClient,\n useNotification,\n} from '@strapi/strapi/admin';\nimport { Link } from 'react-router-dom';\n\nconst useThisCode = true;\n\nconst ConditionalTooltip = ({ isShown, label, children }) => {\n if (isShown) {\n return <Tooltip label={label}>{children}</Tooltip>;\n }\n\n return children;\n};\n\nconst List = ({\n model,\n activeTab, // draft / published\n document,\n}) => {\n const { documentId, id } = document || {}; // support singleTypes\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const [items, setItems] = useState(null);\n const [loaded, setLoaded] = useState(false);\n\n const getter = useCallback(async () => {\n const { get } = getFetchClient();\n let response;\n const endpoint = `/i-relate-to-this/${model}/${id}/${documentId}/${activeTab}`;\n try {\n response = await get(endpoint);\n } catch (error) {\n return toggleNotification({\n type: 'warning',\n message: formatMessage({\n id: 'Failed to load list',\n defaultMessage: error,\n }),\n });\n }\n setItems(response.data.items);\n setLoaded(true);\n return null;\n }, [\n model,\n id,\n documentId,\n activeTab,\n toggleNotification,\n formatMessage,\n setItems,\n ]);\n\n useEffect(() => {\n // single types don't have an documentId\n // on create there are never relations\n setItems(null);\n if (useThisCode && documentId) {\n getter();\n }\n }, [documentId, getter, setItems]);\n\n if (!useThisCode) {\n return null;\n }\n\n if (!loaded) {\n return null;\n }\n\n if (!items || Object.keys(items).length === 0) {\n return 'No relations found';\n }\n\n return Object.entries(items).map(([contentTypeTitle, entries]) => (\n <div key={contentTypeTitle}>\n <h2 style={{ paddingBottom: '0.5rem' }}>{contentTypeTitle}</h2>\n {entries.map(({\n documentId,\n title,\n uid,\n isPublished,\n }) => (\n <div key={documentId} style={{ paddingBottom: '0.5rem' }}>\n <ConditionalTooltip isShown={!isPublished} label={`Current entry is not linked to the published version of ${title}, please publish ${title} to publish the relation`}>\n <Button\n variant={!isPublished ? 'danger' : 'tertiary'}\n tag={Link}\n to={{ pathname: `/content-manager/collection-types/${uid}/${documentId}` }}\n >\n {!isPublished && '⚠'} {title || documentId}\n </Button>\n </ConditionalTooltip>\n </div>\n ))}\n </div>\n ));\n};\n\nexport default List;\n","import List from \"./list\";\n\nconst Panel = (props) => ({\n title: 'Relations to this entry',\n content: <List {...props} />,\n});\n\nexport default Panel;","import Panel from './components/panel';\n\nexport default {\n bootstrap(app) {\n // execute some bootstrap code\n app.getPlugin('content-manager').apis.addEditViewSidePanel([Panel]);\n },\n register() {}\n};\n"],"names":["documentId"],"mappings":";;;;;;AAWA,MAAM,qBAAqB,CAAC,EAAE,SAAS,OAAO,eAAe;AAC3D,MAAI,SAAS;AACX,WAAO,oBAAC,SAAA,EAAQ,OAAe,SAAA,CAAS;AAAA,EAC1C;AAEA,SAAO;AACT;AAEA,MAAM,OAAO,CAAC;AAAA,EACZ;AAAA,EACA;AAAA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,YAAY,GAAA,IAAO,YAAY,CAAA;AACvC,QAAM,EAAE,cAAA,IAAkB,QAAA;AAC1B,QAAM,EAAE,mBAAA,IAAuB,gBAAA;AAC/B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,IAAI;AACvC,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAE1C,QAAM,SAAS,YAAY,YAAY;AACrC,UAAM,EAAE,IAAA,IAAQ,eAAA;AAChB,QAAI;AACJ,UAAM,WAAW,qBAAqB,KAAK,IAAI,EAAE,IAAI,UAAU,IAAI,SAAS;AAC5E,QAAI;AACF,iBAAW,MAAM,IAAI,QAAQ;AAAA,IAC/B,SAAS,OAAO;AACd,aAAO,mBAAmB;AAAA,QACxB,MAAM;AAAA,QACN,SAAS,cAAc;AAAA,UACrB,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB;AAAA,MAAA,CACF;AAAA,IACH;AACA,aAAS,SAAS,KAAK,KAAK;AAC5B,cAAU,IAAI;AACd,WAAO;AAAA,EACT,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,YAAU,MAAM;AAGd,aAAS,IAAI;AACb,QAAmB,YAAY;AAC7B,aAAA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,YAAY,QAAQ,QAAQ,CAAC;AAMjC,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AAC7C,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,kBAAkB,OAAO,MAC1D,qBAAC,OAAA,EACC,UAAA;AAAA,IAAA,oBAAC,QAAG,OAAO,EAAE,eAAe,SAAA,GAAa,UAAA,kBAAiB;AAAA,IACzD,QAAQ,IAAI,CAAC;AAAA,MACZ,YAAAA;AAAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,MAEA,oBAAC,OAAA,EAAqB,OAAO,EAAE,eAAe,YAC5C,UAAA,oBAAC,oBAAA,EAAmB,SAAS,CAAC,aAAa,OAAO,2DAA2D,KAAK,oBAAoB,KAAK,4BACzI,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,CAAC,cAAc,WAAW;AAAA,QACnC,KAAK;AAAA,QACL,IAAI,EAAE,UAAU,qCAAqC,GAAG,IAAIA,WAAU,GAAA;AAAA,QAErE,UAAA;AAAA,UAAA,CAAC,eAAe;AAAA,UAAI;AAAA,UAAE,SAASA;AAAAA,QAAA;AAAA,MAAA;AAAA,IAAA,EAClC,CACF,EAAA,GATQA,WAUV,CACD;AAAA,EAAA,EAAA,GAnBO,gBAoBV,CACD;AACH;ACpGA,MAAM,QAAQ,CAAC,WAAW;AAAA,EACxB,OAAO;AAAA,EACP,SAAS,oBAAC,MAAA,EAAM,GAAG,MAAA,CAAO;AAC5B;ACHA,MAAA,QAAe;AAAA,EACb,UAAU,KAAK;AAEb,QAAI,UAAU,iBAAiB,EAAE,KAAK,qBAAqB,CAAC,KAAK,CAAC;AAAA,EACpE;AAAA,EACA,WAAW;AAAA,EAAC;AACd;"}
|
package/dist/server/index.js
CHANGED
|
@@ -18,8 +18,8 @@ const config = {
|
|
|
18
18
|
const contentTypes = {};
|
|
19
19
|
const controller = ({ strapi: strapi2 }) => ({
|
|
20
20
|
async getunirelations(ctx) {
|
|
21
|
-
const { id, contentType, status } = ctx.request.params;
|
|
22
|
-
const response = await strapi2.service("plugin::i-relate-to-this.service").getunirelations(contentType, id, status);
|
|
21
|
+
const { id, documentId, contentType, status } = ctx.request.params;
|
|
22
|
+
const response = await strapi2.service("plugin::i-relate-to-this.service").getunirelations(contentType, id, documentId, status);
|
|
23
23
|
if (!response) {
|
|
24
24
|
ctx.body = { success: false };
|
|
25
25
|
return;
|
|
@@ -38,7 +38,7 @@ const policies = {};
|
|
|
38
38
|
const adminRoutes = [
|
|
39
39
|
{
|
|
40
40
|
method: "GET",
|
|
41
|
-
path: "
|
|
41
|
+
path: "/:contentType/:id/:documentId/:status",
|
|
42
42
|
handler: "controller.getunirelations"
|
|
43
43
|
}
|
|
44
44
|
];
|
|
@@ -127,14 +127,9 @@ const search = async (id, status, parent) => {
|
|
|
127
127
|
return lookups;
|
|
128
128
|
};
|
|
129
129
|
const service = ({ strapi: strapi2 }) => ({
|
|
130
|
-
async getunirelations(contentType, documentId, status = "draft") {
|
|
130
|
+
async getunirelations(contentType, id, documentId, status = "draft") {
|
|
131
131
|
const ct = strapi2.contentType(contentType);
|
|
132
|
-
const
|
|
133
|
-
documentId,
|
|
134
|
-
fields: ["id"],
|
|
135
|
-
status
|
|
136
|
-
});
|
|
137
|
-
const relatedEntries = await search(entity.id, status, ct);
|
|
132
|
+
const relatedEntries = await search(id, status, ct);
|
|
138
133
|
let publishedDocumentIds = [];
|
|
139
134
|
if (status === "draft") {
|
|
140
135
|
const entityPub = await strapi2.documents(contentType).findOne({
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../server/src/bootstrap.js","../../server/src/destroy.js","../../server/src/register.js","../../server/src/config/index.js","../../server/src/content-types/index.js","../../server/src/controllers/controller.js","../../server/src/controllers/index.js","../../server/src/middlewares/index.js","../../server/src/policies/index.js","../../server/src/routes/admin.js","../../server/src/routes/index.js","../../server/src/services/service.js","../../server/src/services/index.js","../../server/src/index.js"],"sourcesContent":["const bootstrap = ({ strapi }) => {\n // bootstrap phase\n};\n\nexport default bootstrap;\n","const destroy = ({ strapi }) => {\n // destroy phase\n};\n\nexport default destroy;\n","const register = ({ strapi }) => {\n // register phase\n};\n\nexport default register;\n","export default {\n default: {},\n validator() {},\n};\n","export default {};\n","const controller = ({ strapi }) => ({\n async getunirelations(ctx) {\n const { id, contentType, status } = ctx.request.params;\n const response = await strapi.service('plugin::i-relate-to-this.service').getunirelations(contentType, id, status);\n if (!response) {\n ctx.body = { success: false };\n return;\n }\n ctx.body = {\n success: true,\n items: response,\n };\n },\n});\n\nexport default controller;\n","import controller from './controller';\n\nexport default {\n controller,\n};\n","export default {};\n","export default {};\n","export default [\n {\n method: 'GET',\n path: '/list/:contentType/:id/:status',\n handler: 'controller.getunirelations',\n }\n];\n","import adminRoutes from './admin';\n\nconst routes = {\n admin: {\n type: 'admin',\n routes: adminRoutes,\n },\n};\n\nexport default routes;\n","\nimport snakeCase from 'lodash.snakecase';\nimport mergeWith from 'lodash.mergewith';\n\nfunction customizer(objValue, srcValue) {\n if (Array.isArray(objValue)) {\n // we hard assume only one item is added to the array\n return objValue.includes(srcValue[0]) ? objValue : objValue.concat(srcValue[0]);\n }\n return undefined;\n}\n\nconst search = async (id, status, parent) => {\n const modelsWithRelationsToMe = Object\n .values({ ...strapi.contentTypes, ...strapi.components })\n .reduce((total, model) => {\n const {\n attributes,\n } = model;\n const relations = Object.entries(attributes).reduce((acc, [key, {\n type,\n target,\n inversedBy,\n mappedBy,\n component,\n components,\n }]) => {\n // localizations is always a relation to self\n if (key === 'localizations') {\n return acc;\n }\n if (\n // only uni relations\n !(type === 'relation' && target === parent.uid && !inversedBy && !mappedBy)\n && !(type === 'component' && component === parent.uid)\n && !(type === 'dynamiczone' && components?.includes(parent.uid))\n ) {\n return acc;\n }\n return acc.concat({\n key,\n type,\n ...model,\n });\n }, []);\n return total.concat(relations);\n }, []);\n\n const lookups = modelsWithRelationsToMe.reduce(async (acc, {\n key,\n type,\n ...model\n }) => {\n const {\n collectionName,\n modelName,\n } = model;\n const relationIdColumn = type === 'relation' ? strapi.db.metadata.identifiers.getJoinColumnAttributeIdName(\n snakeCase(modelName),\n ) : 'entity_id';\n const parentIdColumn = type === 'relation' ? strapi.db.metadata.identifiers.getJoinColumnAttributeIdName(\n snakeCase(parent.modelName),\n ) : 'cmp_id';\n const tableName = type === 'relation'\n ? `${snakeCase(`${collectionName} ${key} lnk`)}`\n : `${collectionName}_cmps`; // not snaked cased!\n\n // find this item in the db\n // console.log(`getting ${relationIdColumn} for ${parentIdColumn} ${id} from ${tableName}`);\n const relationsInTable = await strapi.db.getConnection(tableName).where({\n [parentIdColumn]: id,\n ...(type === 'relation' ? {} : {\n component_type: parent.uid,\n }),\n });\n\n // not related in this db, skip\n if (relationsInTable.length === 0) {\n return acc;\n }\n\n const itemsForThisCollection = relationsInTable.reduce(async (deepacc, item) => {\n const prev = await deepacc;\n // we've reached our endpoint if:\n if (model.uid.startsWith('api::') || model.uid.startsWith('plugin::')) {\n // make sure we dont have duplicates\n return mergeWith(prev, {\n [model.uid]: {\n info: model.info,\n items: [item[relationIdColumn]],\n },\n }, customizer);\n }\n // still a component, keep searching deeper\n const next = await search(item[relationIdColumn], status, model);\n return mergeWith(prev, next, customizer);\n }, {});\n\n // acc is the list of models, add the current found model ids\n return mergeWith(await acc, await itemsForThisCollection, customizer);\n }, {});\n\n return lookups;\n};\n\nconst service = ({ strapi }) => ({\n async getunirelations(contentType, documentId, status = 'draft') {\n const ct = strapi.contentType(contentType);\n\n // find the db id by documentId\n const entity = await strapi.documents(contentType).findOne({\n documentId,\n fields: ['id'],\n status,\n });\n // go fetch all related items to me\n const relatedEntries = await search(entity.id, status, ct);\n\n let publishedDocumentIds = [];\n if (status === 'draft') {\n // find the db id by documentId\n const entityPub = await strapi.documents(contentType).findOne({\n documentId,\n fields: ['id'],\n status: 'published',\n });\n\n // current document could be draft and have no published version\n if (entityPub) {\n // go fetch all related items to me in published\n const relatedEntriesPub = await search(entityPub.id, status, ct);\n publishedDocumentIds = (await Object.entries(relatedEntriesPub).reduce(async (acc, [\n uid,\n { items },\n ]) => {\n const prev = await acc;\n const entries = (await strapi.documents(uid).findMany({\n filters: { id: { $in: items } },\n status: 'published',\n fields: ['documentId'],\n }));\n // add all entries for all models together\n return prev.concat(entries);\n }, [])).map(({ documentId: dId }) => dId);\n }\n }\n\n // convert results into a list of elements for the UI\n const result = await Object.entries(relatedEntries).reduce(async (acc, [\n uid,\n { items, info },\n ]) => {\n const prev = await acc;\n // // find all entries for this model\n const entries = (await strapi.documents(uid).findMany({\n filters: { id: { $in: items } },\n status,\n }))\n // create an output for the UI\n .map((entry) => ({\n uid,\n title: entry.title || entry.name,\n documentId: entry.documentId,\n isPublished: status === 'published' || publishedDocumentIds.includes(entry.documentId),\n }));\n // add all entries for all models together\n return {\n ...prev,\n [info.displayName]: entries,\n };\n }, {});\n\n return result;\n },\n});\n\nexport default service;\n","import service from './service';\n\nexport default {\n service,\n};\n","/**\n * Application methods\n */\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport register from './register';\n\n/**\n * Plugin server methods\n */\nimport config from './config';\nimport contentTypes from './content-types';\nimport controllers from './controllers';\nimport middlewares from './middlewares';\nimport policies from './policies';\nimport routes from './routes';\nimport services from './services';\n\nexport default {\n bootstrap,\n destroy,\n register,\n\n config,\n controllers,\n contentTypes,\n middlewares,\n policies,\n routes,\n services,\n};\n"],"names":["strapi","snakeCase","mergeWith"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../server/src/bootstrap.js","../../server/src/destroy.js","../../server/src/register.js","../../server/src/config/index.js","../../server/src/content-types/index.js","../../server/src/controllers/controller.js","../../server/src/controllers/index.js","../../server/src/middlewares/index.js","../../server/src/policies/index.js","../../server/src/routes/admin.js","../../server/src/routes/index.js","../../server/src/services/service.js","../../server/src/services/index.js","../../server/src/index.js"],"sourcesContent":["const bootstrap = ({ strapi }) => {\n // bootstrap phase\n};\n\nexport default bootstrap;\n","const destroy = ({ strapi }) => {\n // destroy phase\n};\n\nexport default destroy;\n","const register = ({ strapi }) => {\n // register phase\n};\n\nexport default register;\n","export default {\n default: {},\n validator() {},\n};\n","export default {};\n","const controller = ({ strapi }) => ({\n async getunirelations(ctx) {\n const { id, documentId, contentType, status } = ctx.request.params;\n const response = await strapi.service('plugin::i-relate-to-this.service').getunirelations(contentType, id, documentId, status);\n if (!response) {\n ctx.body = { success: false };\n return;\n }\n ctx.body = {\n success: true,\n items: response,\n };\n },\n});\n\nexport default controller;\n","import controller from './controller';\n\nexport default {\n controller,\n};\n","export default {};\n","export default {};\n","export default [\n {\n method: 'GET',\n path: '/:contentType/:id/:documentId/:status',\n handler: 'controller.getunirelations',\n },\n];\n","import adminRoutes from './admin';\n\nconst routes = {\n admin: {\n type: 'admin',\n routes: adminRoutes,\n },\n};\n\nexport default routes;\n","\nimport snakeCase from 'lodash.snakecase';\nimport mergeWith from 'lodash.mergewith';\n\nfunction customizer(objValue, srcValue) {\n if (Array.isArray(objValue)) {\n // we hard assume only one item is added to the array\n return objValue.includes(srcValue[0]) ? objValue : objValue.concat(srcValue[0]);\n }\n return undefined;\n}\n\nconst search = async (id, status, parent) => {\n const modelsWithRelationsToMe = Object\n .values({ ...strapi.contentTypes, ...strapi.components })\n .reduce((total, model) => {\n const {\n attributes,\n } = model;\n const relations = Object.entries(attributes).reduce((acc, [key, {\n type,\n target,\n inversedBy,\n mappedBy,\n component,\n components,\n }]) => {\n // localizations is always a relation to self\n if (key === 'localizations') {\n return acc;\n }\n if (\n // only uni relations\n !(type === 'relation' && target === parent.uid && !inversedBy && !mappedBy)\n && !(type === 'component' && component === parent.uid)\n && !(type === 'dynamiczone' && components?.includes(parent.uid))\n ) {\n return acc;\n }\n return acc.concat({\n key,\n type,\n ...model,\n });\n }, []);\n return total.concat(relations);\n }, []);\n\n const lookups = modelsWithRelationsToMe.reduce(async (acc, {\n key,\n type,\n ...model\n }) => {\n const {\n collectionName,\n modelName,\n } = model;\n const relationIdColumn = type === 'relation' ? strapi.db.metadata.identifiers.getJoinColumnAttributeIdName(\n snakeCase(modelName),\n ) : 'entity_id';\n const parentIdColumn = type === 'relation' ? strapi.db.metadata.identifiers.getJoinColumnAttributeIdName(\n snakeCase(parent.modelName),\n ) : 'cmp_id';\n const tableName = type === 'relation'\n ? `${snakeCase(`${collectionName} ${key} lnk`)}`\n : `${collectionName}_cmps`; // not snaked cased!\n\n // find this item in the db\n // console.log(`getting ${relationIdColumn} for ${parentIdColumn} ${id} from ${tableName}`);\n const relationsInTable = await strapi.db.getConnection(tableName).where({\n [parentIdColumn]: id,\n ...(type === 'relation' ? {} : {\n component_type: parent.uid,\n }),\n });\n\n // not related in this db, skip\n if (relationsInTable.length === 0) {\n return acc;\n }\n\n const itemsForThisCollection = relationsInTable.reduce(async (deepacc, item) => {\n const prev = await deepacc;\n // we've reached our endpoint if:\n if (model.uid.startsWith('api::') || model.uid.startsWith('plugin::')) {\n // make sure we dont have duplicates\n return mergeWith(prev, {\n [model.uid]: {\n info: model.info,\n items: [item[relationIdColumn]],\n },\n }, customizer);\n }\n // still a component, keep searching deeper\n const next = await search(item[relationIdColumn], status, model);\n return mergeWith(prev, next, customizer);\n }, {});\n\n // acc is the list of models, add the current found model ids\n return mergeWith(await acc, await itemsForThisCollection, customizer);\n }, {});\n\n return lookups;\n};\n\nconst service = ({ strapi }) => ({\n async getunirelations(contentType, id, documentId, status = 'draft') {\n const ct = strapi.contentType(contentType);\n\n // go fetch all related items to me\n const relatedEntries = await search(id, status, ct);\n\n let publishedDocumentIds = [];\n if (status === 'draft') {\n // find the db id by documentId\n const entityPub = await strapi.documents(contentType).findOne({\n documentId,\n fields: ['id'],\n status: 'published',\n });\n\n // current document could be draft and have no published version\n if (entityPub) {\n // go fetch all related items to me in published\n const relatedEntriesPub = await search(entityPub.id, status, ct);\n publishedDocumentIds = (await Object.entries(relatedEntriesPub).reduce(async (acc, [\n uid,\n { items },\n ]) => {\n const prev = await acc;\n const entries = (await strapi.documents(uid).findMany({\n filters: { id: { $in: items } },\n status: 'published',\n fields: ['documentId'],\n }));\n // add all entries for all models together\n return prev.concat(entries);\n }, [])).map(({ documentId: dId }) => dId);\n }\n }\n\n // convert results into a list of elements for the UI\n const result = await Object.entries(relatedEntries).reduce(async (acc, [\n uid,\n { items, info },\n ]) => {\n const prev = await acc;\n // // find all entries for this model\n const entries = (await strapi.documents(uid).findMany({\n filters: { id: { $in: items } },\n status,\n }))\n // create an output for the UI\n .map((entry) => ({\n uid,\n title: entry.title || entry.name,\n documentId: entry.documentId,\n isPublished: status === 'published' || publishedDocumentIds.includes(entry.documentId),\n }));\n // add all entries for all models together\n return {\n ...prev,\n [info.displayName]: entries,\n };\n }, {});\n\n return result;\n },\n});\n\nexport default service;\n","import service from './service';\n\nexport default {\n service,\n};\n","/**\n * Application methods\n */\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport register from './register';\n\n/**\n * Plugin server methods\n */\nimport config from './config';\nimport contentTypes from './content-types';\nimport controllers from './controllers';\nimport middlewares from './middlewares';\nimport policies from './policies';\nimport routes from './routes';\nimport services from './services';\n\nexport default {\n bootstrap,\n destroy,\n register,\n\n config,\n controllers,\n contentTypes,\n middlewares,\n policies,\n routes,\n services,\n};\n"],"names":["strapi","snakeCase","mergeWith"],"mappings":"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"}
|
package/dist/server/index.mjs
CHANGED
|
@@ -14,8 +14,8 @@ const config = {
|
|
|
14
14
|
const contentTypes = {};
|
|
15
15
|
const controller = ({ strapi: strapi2 }) => ({
|
|
16
16
|
async getunirelations(ctx) {
|
|
17
|
-
const { id, contentType, status } = ctx.request.params;
|
|
18
|
-
const response = await strapi2.service("plugin::i-relate-to-this.service").getunirelations(contentType, id, status);
|
|
17
|
+
const { id, documentId, contentType, status } = ctx.request.params;
|
|
18
|
+
const response = await strapi2.service("plugin::i-relate-to-this.service").getunirelations(contentType, id, documentId, status);
|
|
19
19
|
if (!response) {
|
|
20
20
|
ctx.body = { success: false };
|
|
21
21
|
return;
|
|
@@ -34,7 +34,7 @@ const policies = {};
|
|
|
34
34
|
const adminRoutes = [
|
|
35
35
|
{
|
|
36
36
|
method: "GET",
|
|
37
|
-
path: "
|
|
37
|
+
path: "/:contentType/:id/:documentId/:status",
|
|
38
38
|
handler: "controller.getunirelations"
|
|
39
39
|
}
|
|
40
40
|
];
|
|
@@ -123,14 +123,9 @@ const search = async (id, status, parent) => {
|
|
|
123
123
|
return lookups;
|
|
124
124
|
};
|
|
125
125
|
const service = ({ strapi: strapi2 }) => ({
|
|
126
|
-
async getunirelations(contentType, documentId, status = "draft") {
|
|
126
|
+
async getunirelations(contentType, id, documentId, status = "draft") {
|
|
127
127
|
const ct = strapi2.contentType(contentType);
|
|
128
|
-
const
|
|
129
|
-
documentId,
|
|
130
|
-
fields: ["id"],
|
|
131
|
-
status
|
|
132
|
-
});
|
|
133
|
-
const relatedEntries = await search(entity.id, status, ct);
|
|
128
|
+
const relatedEntries = await search(id, status, ct);
|
|
134
129
|
let publishedDocumentIds = [];
|
|
135
130
|
if (status === "draft") {
|
|
136
131
|
const entityPub = await strapi2.documents(contentType).findOne({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../server/src/bootstrap.js","../../server/src/destroy.js","../../server/src/register.js","../../server/src/config/index.js","../../server/src/content-types/index.js","../../server/src/controllers/controller.js","../../server/src/controllers/index.js","../../server/src/middlewares/index.js","../../server/src/policies/index.js","../../server/src/routes/admin.js","../../server/src/routes/index.js","../../server/src/services/service.js","../../server/src/services/index.js","../../server/src/index.js"],"sourcesContent":["const bootstrap = ({ strapi }) => {\n // bootstrap phase\n};\n\nexport default bootstrap;\n","const destroy = ({ strapi }) => {\n // destroy phase\n};\n\nexport default destroy;\n","const register = ({ strapi }) => {\n // register phase\n};\n\nexport default register;\n","export default {\n default: {},\n validator() {},\n};\n","export default {};\n","const controller = ({ strapi }) => ({\n async getunirelations(ctx) {\n const { id, contentType, status } = ctx.request.params;\n const response = await strapi.service('plugin::i-relate-to-this.service').getunirelations(contentType, id, status);\n if (!response) {\n ctx.body = { success: false };\n return;\n }\n ctx.body = {\n success: true,\n items: response,\n };\n },\n});\n\nexport default controller;\n","import controller from './controller';\n\nexport default {\n controller,\n};\n","export default {};\n","export default {};\n","export default [\n {\n method: 'GET',\n path: '/list/:contentType/:id/:status',\n handler: 'controller.getunirelations',\n }\n];\n","import adminRoutes from './admin';\n\nconst routes = {\n admin: {\n type: 'admin',\n routes: adminRoutes,\n },\n};\n\nexport default routes;\n","\nimport snakeCase from 'lodash.snakecase';\nimport mergeWith from 'lodash.mergewith';\n\nfunction customizer(objValue, srcValue) {\n if (Array.isArray(objValue)) {\n // we hard assume only one item is added to the array\n return objValue.includes(srcValue[0]) ? objValue : objValue.concat(srcValue[0]);\n }\n return undefined;\n}\n\nconst search = async (id, status, parent) => {\n const modelsWithRelationsToMe = Object\n .values({ ...strapi.contentTypes, ...strapi.components })\n .reduce((total, model) => {\n const {\n attributes,\n } = model;\n const relations = Object.entries(attributes).reduce((acc, [key, {\n type,\n target,\n inversedBy,\n mappedBy,\n component,\n components,\n }]) => {\n // localizations is always a relation to self\n if (key === 'localizations') {\n return acc;\n }\n if (\n // only uni relations\n !(type === 'relation' && target === parent.uid && !inversedBy && !mappedBy)\n && !(type === 'component' && component === parent.uid)\n && !(type === 'dynamiczone' && components?.includes(parent.uid))\n ) {\n return acc;\n }\n return acc.concat({\n key,\n type,\n ...model,\n });\n }, []);\n return total.concat(relations);\n }, []);\n\n const lookups = modelsWithRelationsToMe.reduce(async (acc, {\n key,\n type,\n ...model\n }) => {\n const {\n collectionName,\n modelName,\n } = model;\n const relationIdColumn = type === 'relation' ? strapi.db.metadata.identifiers.getJoinColumnAttributeIdName(\n snakeCase(modelName),\n ) : 'entity_id';\n const parentIdColumn = type === 'relation' ? strapi.db.metadata.identifiers.getJoinColumnAttributeIdName(\n snakeCase(parent.modelName),\n ) : 'cmp_id';\n const tableName = type === 'relation'\n ? `${snakeCase(`${collectionName} ${key} lnk`)}`\n : `${collectionName}_cmps`; // not snaked cased!\n\n // find this item in the db\n // console.log(`getting ${relationIdColumn} for ${parentIdColumn} ${id} from ${tableName}`);\n const relationsInTable = await strapi.db.getConnection(tableName).where({\n [parentIdColumn]: id,\n ...(type === 'relation' ? {} : {\n component_type: parent.uid,\n }),\n });\n\n // not related in this db, skip\n if (relationsInTable.length === 0) {\n return acc;\n }\n\n const itemsForThisCollection = relationsInTable.reduce(async (deepacc, item) => {\n const prev = await deepacc;\n // we've reached our endpoint if:\n if (model.uid.startsWith('api::') || model.uid.startsWith('plugin::')) {\n // make sure we dont have duplicates\n return mergeWith(prev, {\n [model.uid]: {\n info: model.info,\n items: [item[relationIdColumn]],\n },\n }, customizer);\n }\n // still a component, keep searching deeper\n const next = await search(item[relationIdColumn], status, model);\n return mergeWith(prev, next, customizer);\n }, {});\n\n // acc is the list of models, add the current found model ids\n return mergeWith(await acc, await itemsForThisCollection, customizer);\n }, {});\n\n return lookups;\n};\n\nconst service = ({ strapi }) => ({\n async getunirelations(contentType, documentId, status = 'draft') {\n const ct = strapi.contentType(contentType);\n\n // find the db id by documentId\n const entity = await strapi.documents(contentType).findOne({\n documentId,\n fields: ['id'],\n status,\n });\n // go fetch all related items to me\n const relatedEntries = await search(entity.id, status, ct);\n\n let publishedDocumentIds = [];\n if (status === 'draft') {\n // find the db id by documentId\n const entityPub = await strapi.documents(contentType).findOne({\n documentId,\n fields: ['id'],\n status: 'published',\n });\n\n // current document could be draft and have no published version\n if (entityPub) {\n // go fetch all related items to me in published\n const relatedEntriesPub = await search(entityPub.id, status, ct);\n publishedDocumentIds = (await Object.entries(relatedEntriesPub).reduce(async (acc, [\n uid,\n { items },\n ]) => {\n const prev = await acc;\n const entries = (await strapi.documents(uid).findMany({\n filters: { id: { $in: items } },\n status: 'published',\n fields: ['documentId'],\n }));\n // add all entries for all models together\n return prev.concat(entries);\n }, [])).map(({ documentId: dId }) => dId);\n }\n }\n\n // convert results into a list of elements for the UI\n const result = await Object.entries(relatedEntries).reduce(async (acc, [\n uid,\n { items, info },\n ]) => {\n const prev = await acc;\n // // find all entries for this model\n const entries = (await strapi.documents(uid).findMany({\n filters: { id: { $in: items } },\n status,\n }))\n // create an output for the UI\n .map((entry) => ({\n uid,\n title: entry.title || entry.name,\n documentId: entry.documentId,\n isPublished: status === 'published' || publishedDocumentIds.includes(entry.documentId),\n }));\n // add all entries for all models together\n return {\n ...prev,\n [info.displayName]: entries,\n };\n }, {});\n\n return result;\n },\n});\n\nexport default service;\n","import service from './service';\n\nexport default {\n service,\n};\n","/**\n * Application methods\n */\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport register from './register';\n\n/**\n * Plugin server methods\n */\nimport config from './config';\nimport contentTypes from './content-types';\nimport controllers from './controllers';\nimport middlewares from './middlewares';\nimport policies from './policies';\nimport routes from './routes';\nimport services from './services';\n\nexport default {\n bootstrap,\n destroy,\n register,\n\n config,\n controllers,\n contentTypes,\n middlewares,\n policies,\n routes,\n services,\n};\n"],"names":["strapi"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../server/src/bootstrap.js","../../server/src/destroy.js","../../server/src/register.js","../../server/src/config/index.js","../../server/src/content-types/index.js","../../server/src/controllers/controller.js","../../server/src/controllers/index.js","../../server/src/middlewares/index.js","../../server/src/policies/index.js","../../server/src/routes/admin.js","../../server/src/routes/index.js","../../server/src/services/service.js","../../server/src/services/index.js","../../server/src/index.js"],"sourcesContent":["const bootstrap = ({ strapi }) => {\n // bootstrap phase\n};\n\nexport default bootstrap;\n","const destroy = ({ strapi }) => {\n // destroy phase\n};\n\nexport default destroy;\n","const register = ({ strapi }) => {\n // register phase\n};\n\nexport default register;\n","export default {\n default: {},\n validator() {},\n};\n","export default {};\n","const controller = ({ strapi }) => ({\n async getunirelations(ctx) {\n const { id, documentId, contentType, status } = ctx.request.params;\n const response = await strapi.service('plugin::i-relate-to-this.service').getunirelations(contentType, id, documentId, status);\n if (!response) {\n ctx.body = { success: false };\n return;\n }\n ctx.body = {\n success: true,\n items: response,\n };\n },\n});\n\nexport default controller;\n","import controller from './controller';\n\nexport default {\n controller,\n};\n","export default {};\n","export default {};\n","export default [\n {\n method: 'GET',\n path: '/:contentType/:id/:documentId/:status',\n handler: 'controller.getunirelations',\n },\n];\n","import adminRoutes from './admin';\n\nconst routes = {\n admin: {\n type: 'admin',\n routes: adminRoutes,\n },\n};\n\nexport default routes;\n","\nimport snakeCase from 'lodash.snakecase';\nimport mergeWith from 'lodash.mergewith';\n\nfunction customizer(objValue, srcValue) {\n if (Array.isArray(objValue)) {\n // we hard assume only one item is added to the array\n return objValue.includes(srcValue[0]) ? objValue : objValue.concat(srcValue[0]);\n }\n return undefined;\n}\n\nconst search = async (id, status, parent) => {\n const modelsWithRelationsToMe = Object\n .values({ ...strapi.contentTypes, ...strapi.components })\n .reduce((total, model) => {\n const {\n attributes,\n } = model;\n const relations = Object.entries(attributes).reduce((acc, [key, {\n type,\n target,\n inversedBy,\n mappedBy,\n component,\n components,\n }]) => {\n // localizations is always a relation to self\n if (key === 'localizations') {\n return acc;\n }\n if (\n // only uni relations\n !(type === 'relation' && target === parent.uid && !inversedBy && !mappedBy)\n && !(type === 'component' && component === parent.uid)\n && !(type === 'dynamiczone' && components?.includes(parent.uid))\n ) {\n return acc;\n }\n return acc.concat({\n key,\n type,\n ...model,\n });\n }, []);\n return total.concat(relations);\n }, []);\n\n const lookups = modelsWithRelationsToMe.reduce(async (acc, {\n key,\n type,\n ...model\n }) => {\n const {\n collectionName,\n modelName,\n } = model;\n const relationIdColumn = type === 'relation' ? strapi.db.metadata.identifiers.getJoinColumnAttributeIdName(\n snakeCase(modelName),\n ) : 'entity_id';\n const parentIdColumn = type === 'relation' ? strapi.db.metadata.identifiers.getJoinColumnAttributeIdName(\n snakeCase(parent.modelName),\n ) : 'cmp_id';\n const tableName = type === 'relation'\n ? `${snakeCase(`${collectionName} ${key} lnk`)}`\n : `${collectionName}_cmps`; // not snaked cased!\n\n // find this item in the db\n // console.log(`getting ${relationIdColumn} for ${parentIdColumn} ${id} from ${tableName}`);\n const relationsInTable = await strapi.db.getConnection(tableName).where({\n [parentIdColumn]: id,\n ...(type === 'relation' ? {} : {\n component_type: parent.uid,\n }),\n });\n\n // not related in this db, skip\n if (relationsInTable.length === 0) {\n return acc;\n }\n\n const itemsForThisCollection = relationsInTable.reduce(async (deepacc, item) => {\n const prev = await deepacc;\n // we've reached our endpoint if:\n if (model.uid.startsWith('api::') || model.uid.startsWith('plugin::')) {\n // make sure we dont have duplicates\n return mergeWith(prev, {\n [model.uid]: {\n info: model.info,\n items: [item[relationIdColumn]],\n },\n }, customizer);\n }\n // still a component, keep searching deeper\n const next = await search(item[relationIdColumn], status, model);\n return mergeWith(prev, next, customizer);\n }, {});\n\n // acc is the list of models, add the current found model ids\n return mergeWith(await acc, await itemsForThisCollection, customizer);\n }, {});\n\n return lookups;\n};\n\nconst service = ({ strapi }) => ({\n async getunirelations(contentType, id, documentId, status = 'draft') {\n const ct = strapi.contentType(contentType);\n\n // go fetch all related items to me\n const relatedEntries = await search(id, status, ct);\n\n let publishedDocumentIds = [];\n if (status === 'draft') {\n // find the db id by documentId\n const entityPub = await strapi.documents(contentType).findOne({\n documentId,\n fields: ['id'],\n status: 'published',\n });\n\n // current document could be draft and have no published version\n if (entityPub) {\n // go fetch all related items to me in published\n const relatedEntriesPub = await search(entityPub.id, status, ct);\n publishedDocumentIds = (await Object.entries(relatedEntriesPub).reduce(async (acc, [\n uid,\n { items },\n ]) => {\n const prev = await acc;\n const entries = (await strapi.documents(uid).findMany({\n filters: { id: { $in: items } },\n status: 'published',\n fields: ['documentId'],\n }));\n // add all entries for all models together\n return prev.concat(entries);\n }, [])).map(({ documentId: dId }) => dId);\n }\n }\n\n // convert results into a list of elements for the UI\n const result = await Object.entries(relatedEntries).reduce(async (acc, [\n uid,\n { items, info },\n ]) => {\n const prev = await acc;\n // // find all entries for this model\n const entries = (await strapi.documents(uid).findMany({\n filters: { id: { $in: items } },\n status,\n }))\n // create an output for the UI\n .map((entry) => ({\n uid,\n title: entry.title || entry.name,\n documentId: entry.documentId,\n isPublished: status === 'published' || publishedDocumentIds.includes(entry.documentId),\n }));\n // add all entries for all models together\n return {\n ...prev,\n [info.displayName]: entries,\n };\n }, {});\n\n return result;\n },\n});\n\nexport default service;\n","import service from './service';\n\nexport default {\n service,\n};\n","/**\n * Application methods\n */\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport register from './register';\n\n/**\n * Plugin server methods\n */\nimport config from './config';\nimport contentTypes from './content-types';\nimport controllers from './controllers';\nimport middlewares from './middlewares';\nimport policies from './policies';\nimport routes from './routes';\nimport services from './services';\n\nexport default {\n bootstrap,\n destroy,\n register,\n\n config,\n controllers,\n contentTypes,\n middlewares,\n policies,\n routes,\n services,\n};\n"],"names":["strapi"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.
|
|
2
|
+
"version": "0.2.0",
|
|
3
3
|
"keywords": [],
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"exports": {
|
|
@@ -62,6 +62,6 @@
|
|
|
62
62
|
"author": "Laurens Kling <laurens@goedideemedia.nl>",
|
|
63
63
|
"repository": {
|
|
64
64
|
"type": "git",
|
|
65
|
-
"url": "git@github.com
|
|
65
|
+
"url": "git+ssh://git@github.com/laurenskling/strapi-plugin-i-relate-to-this.git"
|
|
66
66
|
}
|
|
67
67
|
}
|