@strapi/admin 4.6.1 → 4.7.0-beta.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.
Files changed (93) hide show
  1. package/admin/src/assets/images/onboarding-preview.png +0 -0
  2. package/admin/src/content-manager/components/CollectionTypeFormWrapper/index.js +0 -2
  3. package/admin/src/hooks/useRegenerate/index.js +2 -2
  4. package/admin/src/hooks/useSettingsMenu/utils/defaultGlobalLinks.js +7 -0
  5. package/admin/src/pages/Admin/Onboarding/constants.js +46 -0
  6. package/admin/src/pages/Admin/Onboarding/index.js +161 -89
  7. package/admin/src/pages/Admin/index.js +5 -2
  8. package/admin/src/pages/SettingsPage/{pages/ApiTokens/EditView/components → components/Tokens}/FormHead/index.js +36 -19
  9. package/admin/src/pages/SettingsPage/components/Tokens/FormiTokenContainer/LifeSpanInput.js +96 -0
  10. package/admin/src/pages/SettingsPage/components/Tokens/LifeSpanInput/index.js +98 -0
  11. package/admin/src/pages/SettingsPage/components/Tokens/Regenerate/index.js +73 -0
  12. package/admin/src/pages/SettingsPage/{pages/ApiTokens/ListView/DynamicTable → components/Tokens/Table}/DefaultButton/index.js +1 -1
  13. package/admin/src/pages/SettingsPage/{pages/ApiTokens/ListView/DynamicTable → components/Tokens/Table}/DeleteButton/index.js +1 -1
  14. package/admin/src/pages/SettingsPage/{pages/ApiTokens/ListView/DynamicTable → components/Tokens/Table}/ReadButton/index.js +0 -0
  15. package/admin/src/pages/SettingsPage/{pages/ApiTokens/ListView/DynamicTable → components/Tokens/Table}/UpdateButton/index.js +0 -0
  16. package/admin/src/pages/SettingsPage/components/Tokens/Table/index.js +135 -0
  17. package/admin/src/pages/SettingsPage/{pages/ApiTokens/EditView/components/ContentBox → components/Tokens/TokenBox}/index.js +17 -17
  18. package/admin/src/pages/SettingsPage/components/Tokens/TokenDescription/index.js +51 -0
  19. package/admin/src/pages/SettingsPage/components/Tokens/TokenName/index.js +46 -0
  20. package/admin/src/pages/SettingsPage/components/Tokens/TokenTypeSelect/index.js +69 -0
  21. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/index.js +5 -3
  22. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormApiTokenContainer/index.js +52 -142
  23. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Regenerate/index.js +5 -1
  24. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/index.js +37 -14
  25. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/index.js +5 -13
  26. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/FormTransferTokenContainer/index.js +105 -0
  27. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/LoadingView/index.js +50 -0
  28. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/index.js +201 -0
  29. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/getDateOfExpiration.js +16 -0
  30. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/index.js +4 -0
  31. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/schema.js +10 -0
  32. package/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/index.js +182 -0
  33. package/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/utils/tableHeaders.js +48 -0
  34. package/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedCreateView/index.js +14 -0
  35. package/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedEditView/index.js +14 -0
  36. package/admin/src/pages/SettingsPage/pages/TransferTokens/ProtectedListView/index.js +12 -0
  37. package/admin/src/pages/SettingsPage/utils/defaultRoutes.js +33 -0
  38. package/admin/src/permissions/defaultPermissions.js +8 -0
  39. package/admin/src/translations/en.json +18 -1
  40. package/build/19eb2dfcf2603eb55733.png +0 -0
  41. package/build/4649.15cc0afe.chunk.js +30 -0
  42. package/build/7259.aa68d808.chunk.js +1 -0
  43. package/build/7407.883fb1f5.chunk.js +1 -0
  44. package/build/Admin-authenticatedApp.f29f6021.chunk.js +79 -0
  45. package/build/{Admin_settingsPage.d1493824.chunk.js → Admin_settingsPage.178dc6e3.chunk.js} +25 -25
  46. package/build/{admin-app.25934eaa.chunk.js → admin-app.77a50e1f.chunk.js} +19 -19
  47. package/build/{api-tokens-create-page.d248362d.chunk.js → api-tokens-create-page.0db3aec1.chunk.js} +1 -1
  48. package/build/{api-tokens-edit-page.8516fa20.chunk.js → api-tokens-edit-page.671e0e26.chunk.js} +1 -1
  49. package/build/api-tokens-list-page.7387102c.chunk.js +16 -0
  50. package/build/{content-manager.35ff9726.chunk.js → content-manager.42b24d46.chunk.js} +77 -77
  51. package/build/en-json.b0748970.chunk.js +1 -0
  52. package/build/index.html +1 -1
  53. package/build/main.1022ed01.js +4393 -0
  54. package/build/runtime~main.84941a97.js +2 -0
  55. package/build/transfer-tokens-create-page.16e23791.chunk.js +1 -0
  56. package/build/transfer-tokens-edit-page.3886c973.chunk.js +1 -0
  57. package/build/transfer-tokens-list-page.e8010a89.chunk.js +16 -0
  58. package/package.json +12 -12
  59. package/server/bootstrap.js +2 -0
  60. package/server/config/admin-actions.js +48 -0
  61. package/server/content-types/index.js +2 -0
  62. package/server/content-types/transfer-token-permission.js +36 -0
  63. package/server/content-types/transfer-token.js +66 -0
  64. package/server/controllers/api-token.js +4 -5
  65. package/server/controllers/index.js +1 -0
  66. package/server/controllers/transfer/index.js +13 -0
  67. package/server/controllers/transfer/runner.js +24 -0
  68. package/server/controllers/transfer/token.js +131 -0
  69. package/server/register.js +2 -9
  70. package/server/routes/index.js +2 -0
  71. package/server/routes/transfer.js +95 -0
  72. package/server/services/api-token.js +2 -3
  73. package/server/services/constants.js +6 -0
  74. package/server/services/index.js +1 -0
  75. package/server/services/transfer/index.js +6 -0
  76. package/server/services/transfer/permission.js +22 -0
  77. package/server/services/transfer/token.js +409 -0
  78. package/server/strategies/api-token.js +4 -2
  79. package/server/strategies/data-transfer.js +107 -0
  80. package/server/strategies/index.js +1 -0
  81. package/server/utils/index.d.ts +2 -0
  82. package/server/validation/api-tokens.js +1 -6
  83. package/server/validation/transfer/index.js +5 -0
  84. package/server/validation/transfer/token.js +34 -0
  85. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormBody/index.js +0 -78
  86. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/index.js +0 -112
  87. package/build/4318.f96a9d4d.chunk.js +0 -30
  88. package/build/8633.00ccd382.chunk.js +0 -1
  89. package/build/Admin-authenticatedApp.ce646f66.chunk.js +0 -75
  90. package/build/api-tokens-list-page.44a79fda.chunk.js +0 -16
  91. package/build/en-json.1f137a90.chunk.js +0 -1
  92. package/build/main.7b151630.js +0 -4377
  93. package/build/runtime~main.a20d633b.js +0 -2
@@ -0,0 +1,2 @@
1
+ (function(){"use strict";var j={},m={};function e(n){var i=m[n];if(i!==void 0)return i.exports;var t=m[n]={id:n,loaded:!1,exports:{}};return j[n].call(t.exports,t,t.exports,e),t.loaded=!0,t.exports}e.m=j,function(){var n=[];e.O=function(i,t,o,r){if(t){r=r||0;for(var s=n.length;s>0&&n[s-1][2]>r;s--)n[s]=n[s-1];n[s]=[t,o,r];return}for(var a=1/0,s=0;s<n.length;s++){for(var t=n[s][0],o=n[s][1],r=n[s][2],c=!0,l=0;l<t.length;l++)(r&!1||a>=r)&&Object.keys(e.O).every(function(b){return e.O[b](t[l])})?t.splice(l--,1):(c=!1,r<a&&(a=r));if(c){n.splice(s--,1);var d=o();d!==void 0&&(i=d)}}return i}}(),function(){e.n=function(n){var i=n&&n.__esModule?function(){return n.default}:function(){return n};return e.d(i,{a:i}),i}}(),function(){var n=Object.getPrototypeOf?function(t){return Object.getPrototypeOf(t)}:function(t){return t.__proto__},i;e.t=function(t,o){if(o&1&&(t=this(t)),o&8||typeof t=="object"&&t&&(o&4&&t.__esModule||o&16&&typeof t.then=="function"))return t;var r=Object.create(null);e.r(r);var s={};i=i||[null,n({}),n([]),n(n)];for(var a=o&2&&t;typeof a=="object"&&!~i.indexOf(a);a=n(a))Object.getOwnPropertyNames(a).forEach(function(c){s[c]=function(){return t[c]}});return s.default=function(){return t},e.d(r,s),r}}(),function(){e.d=function(n,i){for(var t in i)e.o(i,t)&&!e.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:i[t]})}}(),function(){e.f={},e.e=function(n){return Promise.all(Object.keys(e.f).reduce(function(i,t){return e.f[t](n,i),i},[]))}}(),function(){e.u=function(n){return""+({46:"content-type-builder-translation-zh-Hans-json",90:"i18n-translation-de-json",92:"api-tokens-edit-page",96:"email-translation-de-json",123:"ru-json",129:"i18n-translation-es-json",302:"sso-settings-page",320:"en-json",395:"tr-json",435:"email-translation-it-json",562:"no-json",585:"upload-translation-pt-json",606:"sk-json",615:"upload-translation-uk-json",695:"upload-settings",742:"content-type-builder-translation-th-json",744:"email-translation-cs-json",749:"th-json",801:"Admin-authenticatedApp",830:"he-json",931:"content-type-builder-translation-en-json",994:"content-manager",1001:"content-type-builder-translation-nl-json",1009:"upload-translation-ms-json",1011:"zh-json",1018:"email-translation-ko-json",1023:"content-type-builder-translation-it-json",1056:"upload-translation-tr-json",1157:"email-translation-pt-BR-json",1167:"users-permissions-translation-ko-json",1180:"i18n-translation-tr-json",1312:"ja-json",1331:"upload-translation-es-json",1375:"upload-translation-pt-BR-json",1377:"ko-json",1442:"users-permissions-translation-cs-json",1495:"email-settings-page",1674:"users-permissions-translation-ru-json",1930:"users-permissions-translation-pt-json",2137:"i18n-translation-fr-json",2151:"content-type-builder-translation-id-json",2246:"content-type-builder-translation-dk-json",2248:"gu-json",2282:"users-providers-settings-page",2380:"users-permissions-translation-tr-json",2411:"email-translation-tr-json",2464:"users-permissions-translation-de-json",2489:"upload-translation-ko-json",2492:"transfer-tokens-edit-page",2544:"admin-edit-roles-page",2553:"zh-Hans-json",2567:"content-type-builder-translation-ko-json",2603:"email-translation-en-json",2648:"email-translation-ar-json",2657:"content-type-builder-translation-cs-json",2671:"nl-json",2742:"users-permissions-translation-zh-Hans-json",2812:"audit-logs-settings-page",3025:"ms-json",3038:"upload-translation-sk-json",3043:"email-translation-zh-Hans-json",3095:"users-permissions-translation-sk-json",3098:"users-permissions-translation-fr-json",3166:"email-translation-pt-json",3206:"email-translation-nl-json",3278:"vi-json",3304:"content-type-builder-translation-tr-json",3340:"pt-json",3516:"ca-json",3530:"users-permissions-translation-vi-json",3552:"i18n-settings-page",3650:"upload",3677:"Admin_pluginsPage",3702:"users-permissions-translation-pl-json",3825:"email-translation-dk-json",3948:"content-type-builder-translation-pl-json",3964:"content-type-builder-translation-ms-json",3981:"Admin_homePage",4021:"upload-translation-de-json",4121:"webhook-list-page",4179:"users-permissions-translation-id-json",4263:"admin-edit-users",4299:"api-tokens-create-page",4302:"content-type-builder-translation-zh-json",4587:"email-translation-th-json",4693:"email-translation-fr-json",4804:"upload-translation-ru-json",4816:"transfer-tokens-create-page",4987:"upload-translation-pl-json",5053:"upload-translation-zh-json",5162:"webhook-edit-page",5199:"admin-users",5222:"upload-translation-it-json",5296:"i18n-translation-dk-json",5388:"email-translation-ru-json",5396:"users-permissions-translation-zh-json",5516:"Admin_marketplace",5538:"admin-app",5751:"email-translation-es-json",5880:"upload-translation-ja-json",5894:"hu-json",5895:"Admin_settingsPage",5905:"content-type-builder-list-view",5906:"content-type-builder-translation-pt-BR-json",6232:"upload-translation-th-json",6280:"i18n-translation-ko-json",6332:"hi-json",6377:"users-permissions-translation-dk-json",6434:"upload-translation-en-json",6460:"users-permissions-translation-en-json",6745:"email-translation-uk-json",6784:"email-translation-ms-json",6817:"it-json",6831:"upload-translation-zh-Hans-json",6836:"users-permissions-translation-uk-json",6848:"email-translation-zh-json",6901:"de-json",7048:"users-permissions-translation-nl-json",7094:"users-permissions-translation-ar-json",7155:"content-type-builder-translation-de-json",7186:"content-type-builder-translation-ru-json",7327:"email-translation-vi-json",7347:"highlight.js",7403:"uk-json",7465:"upload-translation-dk-json",7519:"cs-json",7663:"email-translation-id-json",7808:"i18n-translation-zh-json",7817:"users-permissions-translation-es-json",7828:"users-permissions-translation-th-json",7833:"upload-translation-fr-json",7846:"pl-json",7898:"dk-json",7934:"content-type-builder-translation-pt-json",7958:"ar-json",7997:"content-type-builder-translation-sk-json",8006:"fr-json",8056:"api-tokens-list-page",8175:"i18n-translation-en-json",8178:"email-translation-ja-json",8329:"content-type-builder-translation-sv-json",8342:"content-type-builder-translation-es-json",8360:"eu-json",8367:"es-json",8418:"users-email-settings-page",8423:"upload-translation-ca-json",8467:"users-permissions-translation-sv-json",8481:"email-translation-pl-json",8573:"content-type-builder-translation-uk-json",8736:"users-permissions-translation-pt-BR-json",8853:"users-roles-settings-page",8880:"content-type-builder",8897:"id-json",8907:"content-type-builder-translation-ja-json",8965:"content-type-builder-translation-fr-json",9220:"users-permissions-translation-ms-json",9303:"sv-json",9366:"i18n-translation-pl-json",9412:"email-translation-sk-json",9460:"users-advanced-settings-page",9497:"Admin_profilePage",9501:"Admin_InternalErrorPage",9502:"users-permissions-translation-ja-json",9511:"content-type-builder-translation-ar-json",9514:"Upload_ConfigureTheView",9600:"transfer-tokens-list-page",9647:"pt-BR-json",9726:"sa-json",9762:"i18n-translation-zh-Hans-json",9797:"upload-translation-he-json",9903:"ml-json",9905:"users-permissions-translation-it-json"}[n]||n)+"."+{46:"52a30266",90:"362384a6",92:"671e0e26",96:"1b334230",123:"aa5cd123",129:"87b494d1",302:"b85ad080",320:"b0748970",395:"9f41dc08",435:"a2ed8c78",562:"1a2258ba",585:"6b937fdf",606:"9ec60d9f",615:"9950466a",695:"ef64bbf9",742:"6fe3ed55",744:"6eaeec6a",749:"6e68155c",801:"f29f6021",830:"ad22e8cc",931:"e577d595",994:"42b24d46",1001:"40bbc562",1009:"74f6d746",1011:"f88f563d",1018:"4de49b23",1023:"13b3c26a",1056:"74117e5c",1157:"81cca553",1167:"357d7a33",1180:"10f0600d",1312:"c9f12d0b",1331:"ba2eb03a",1375:"d1704f0b",1377:"ef463065",1412:"936ed920",1442:"7e23424a",1495:"d1fcc7a3",1674:"20e177db",1683:"c8aa7b7c",1930:"a7eda429",2137:"57ddc77e",2151:"ee3b36bb",2246:"e05583e9",2248:"676518f2",2282:"e5a9a3f1",2380:"2bd7ff98",2411:"e6c0f8fc",2464:"a6fb670f",2489:"a52eab64",2492:"3886c973",2544:"446b69dc",2553:"9c0eac99",2567:"8a274be5",2603:"4211d4d0",2607:"2e48dbf8",2648:"88304564",2657:"a5b299ca",2671:"c416295a",2742:"0b31c705",2743:"6d1632f9",2812:"c3dce30d",3025:"db87d8d3",3038:"483a18f6",3043:"c6841563",3075:"dc3894fe",3095:"7f37180f",3098:"7e55bbbb",3166:"2a2a0643",3206:"377bdd9f",3278:"f08d7d03",3304:"cea4d226",3340:"62927d1e",3516:"f6a0f472",3530:"6722a8a2",3552:"b8d8753e",3632:"0317b618",3650:"c5730dfa",3677:"5c24f963",3702:"0a7287d1",3825:"85402492",3948:"24a34349",3964:"2d29c1e0",3981:"b1730882",4021:"420c943b",4121:"1134f130",4179:"a5a0fb59",4263:"2ed69bfd",4299:"0db3aec1",4302:"faedd610",4587:"660fa9a8",4649:"15cc0afe",4693:"78be2787",4804:"675f6b93",4816:"16e23791",4855:"bd092921",4987:"426f31c9",5015:"8e3fe50b",5053:"e1dd6eb2",5162:"73e51e64",5199:"fc003b10",5222:"e87d7966",5296:"89401417",5388:"6bce37dd",5396:"7978eaa6",5516:"ea0316c2",5538:"77a50e1f",5751:"0b6b1006",5880:"44b88e7a",5894:"f947088f",5895:"178dc6e3",5905:"79e84b36",5906:"97f71a9d",6232:"3847dae0",6280:"ef4f9471",6332:"19b51c09",6377:"60e50f48",6434:"8b7573ce",6460:"4b302272",6745:"bd1fb6bf",6784:"7390477e",6817:"2fd90f4d",6831:"3da5cf56",6836:"6a0a1572",6848:"7a2232ea",6901:"30e1f35b",7048:"c9f92a3c",7094:"7d87d54d",7155:"0979cccb",7186:"54d11230",7259:"aa68d808",7327:"9fb7e6d7",7347:"26ef649f",7403:"b2fcd567",7407:"883fb1f5",7465:"bbb2fa05",7519:"79879fb6",7663:"c97239fe",7808:"bef2dc07",7817:"35007573",7828:"1e9c0247",7833:"84429734",7846:"8cf0c871",7898:"e6d9ffa4",7934:"ddb44f8c",7958:"932794f7",7997:"626c9493",8006:"78545ef8",8056:"7387102c",8175:"60af6722",8178:"63eebd02",8329:"59f5e1e5",8342:"fe4daad8",8360:"fceecd8b",8367:"e275481d",8418:"343d0ad2",8423:"57954414",8467:"17187818",8481:"97d0db97",8573:"c4524247",8736:"1b6d2920",8853:"66312f31",8880:"855db321",8897:"504daa84",8907:"9be0d5b2",8965:"b1eb52f6",9220:"c83f87c4",9303:"c6b0c237",9366:"dfac513d",9412:"53da2fcd",9460:"fce9908e",9497:"59af1978",9501:"157152a8",9502:"891fe76e",9511:"56d8fcf4",9514:"3f2b6e6a",9600:"e8010a89",9647:"51fab8d0",9707:"7290fd92",9726:"f3fa5407",9762:"757ce62d",9797:"0a830937",9903:"490f666c",9905:"0705465d"}[n]+".chunk.js"}}(),function(){e.miniCssF=function(n){}}(),function(){e.g=function(){if(typeof globalThis=="object")return globalThis;try{return this||new Function("return this")()}catch{if(typeof window=="object")return window}}()}(),function(){e.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)}}(),function(){var n={},i="@strapi/admin:";e.l=function(t,o,r,s){if(n[t]){n[t].push(o);return}var a,c;if(r!==void 0)for(var l=document.getElementsByTagName("script"),d=0;d<l.length;d++){var f=l[d];if(f.getAttribute("src")==t||f.getAttribute("data-webpack")==i+r){a=f;break}}a||(c=!0,a=document.createElement("script"),a.charset="utf-8",a.timeout=120,e.nc&&a.setAttribute("nonce",e.nc),a.setAttribute("data-webpack",i+r),a.src=t),n[t]=[o];var u=function(g,b){a.onerror=a.onload=null,clearTimeout(p);var h=n[t];if(delete n[t],a.parentNode&&a.parentNode.removeChild(a),h&&h.forEach(function(y){return y(b)}),g)return g(b)},p=setTimeout(u.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=u.bind(null,a.onerror),a.onload=u.bind(null,a.onload),c&&document.head.appendChild(a)}}(),function(){e.r=function(n){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})}}(),function(){e.nmd=function(n){return n.paths=[],n.children||(n.children=[]),n}}(),function(){e.p="/admin/"}(),function(){e.b=document.baseURI||self.location.href;var n={1303:0};e.f.j=function(o,r){var s=e.o(n,o)?n[o]:void 0;if(s!==0)if(s)r.push(s[2]);else if(o!=1303){var a=new Promise(function(f,u){s=n[o]=[f,u]});r.push(s[2]=a);var c=e.p+e.u(o),l=new Error,d=function(f){if(e.o(n,o)&&(s=n[o],s!==0&&(n[o]=void 0),s)){var u=f&&(f.type==="load"?"missing":f.type),p=f&&f.target&&f.target.src;l.message="Loading chunk "+o+` failed.
2
+ (`+u+": "+p+")",l.name="ChunkLoadError",l.type=u,l.request=p,s[1](l)}};e.l(c,d,"chunk-"+o,o)}else n[o]=0},e.O.j=function(o){return n[o]===0};var i=function(o,r){var s=r[0],a=r[1],c=r[2],l,d,f=0;if(s.some(function(p){return n[p]!==0})){for(l in a)e.o(a,l)&&(e.m[l]=a[l]);if(c)var u=c(e)}for(o&&o(r);f<s.length;f++)d=s[f],e.o(n,d)&&n[d]&&n[d][0](),n[d]=0;return e.O(u)},t=self.webpackChunk_strapi_admin=self.webpackChunk_strapi_admin||[];t.forEach(i.bind(null,0)),t.push=i.bind(null,t.push.bind(t))}(),function(){e.nc=void 0}()})();
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunk_strapi_admin=self.webpackChunk_strapi_admin||[]).push([[4816],{76411:function(r,s,e){e.r(s);var t=e(32735),n=e(88425),i=e.n(n),_=e(72041),a=e(37259);const E=()=>t.createElement(n.CheckPagePermissions,{permissions:_.Z.settings["transfer-tokens"].create},t.createElement(a.Z,null));s.default=E}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunk_strapi_admin=self.webpackChunk_strapi_admin||[]).push([[2492],{32392:function(r,s,e){e.r(s);var n=e(32735),t=e(88425),i=e.n(t),_=e(72041),a=e(37259);const E=()=>n.createElement(t.CheckPagePermissions,{permissions:_.Z.settings["transfer-tokens"].read},n.createElement(a.Z,null));s.default=E}}]);
@@ -0,0 +1,16 @@
1
+ "use strict";(self.webpackChunk_strapi_admin=self.webpackChunk_strapi_admin||[]).push([[9600],{81450:function(j,C,t){t.d(C,{Z:function(){return O}});var e=t(32735),r=t(5141),R=t(60216),n=t.n(R),u=t(49372),B=t(3594),P=t(29005),g=t(66735),U=t(87933),l=t(88425),I=t(4038),V=t(50563),D=t(72850),Z=t(5636);const L=({tokenName:a,onClickDelete:i})=>{const{formatMessage:T}=(0,Z.useIntl)(),{trackUsage:y}=(0,l.useTracking)();return e.createElement(D.x,{paddingLeft:1,...l.stopPropagation},e.createElement(V.h,{onClick:()=>{y("willDeleteToken"),i()},label:T({id:"global.delete-target",defaultMessage:"Delete {target}"},{target:`${a}`}),name:"delete",noBorder:!0,icon:e.createElement(I.default,null)}))};L.propTypes={tokenName:n().string.isRequired,onClickDelete:n().func.isRequired};var x=L,W=t(68625),$=t(83292);const z={edit:{id:"app.component.table.edit",defaultMessage:"Edit {target}"},read:{id:"app.component.table.read",defaultMessage:"Read {target}"}},F=(0,$.default)(l.Link)`
2
+ svg {
3
+ path {
4
+ fill: ${({theme:a})=>a.colors.neutral500};
5
+ }
6
+ }
7
+
8
+ &:hover,
9
+ &:focus {
10
+ svg {
11
+ path {
12
+ fill: ${({theme:a})=>a.colors.neutral800};
13
+ }
14
+ }
15
+ }
16
+ `,h=({tokenName:a,tokenId:i,buttonType:T,children:y})=>{const{formatMessage:d}=(0,Z.useIntl)(),{location:{pathname:f}}=(0,r.useHistory)();return e.createElement(F,{to:`${f}/${i}`,title:d(z[T],{target:a})},y)};h.propTypes={tokenName:n().string.isRequired,tokenId:n().oneOfType([n().string,n().number]).isRequired,buttonType:n().string,children:n().node.isRequired},h.defaultProps={buttonType:"edit"};var m=h;const E=({tokenName:a,tokenId:i})=>e.createElement(m,{tokenName:a,tokenId:i},e.createElement(W.Z,null));E.propTypes={tokenName:n().string.isRequired,tokenId:n().oneOfType([n().string,n().number]).isRequired};var k=E,H=t(54894);const M=({tokenName:a,tokenId:i})=>e.createElement(m,{tokenName:a,tokenId:i,buttonType:"read"},e.createElement(H.default,null));M.propTypes={tokenName:n().string.isRequired,tokenId:n().oneOfType([n().string,n().number]).isRequired};var c=M;const v=({permissions:a,headers:i,contentType:T,isLoading:y,tokens:d,onConfirmDelete:f})=>{const{canDelete:S,canUpdate:p,canRead:b}=a,A=S||p||b,[{query:N}]=(0,l.useQueryParams)(),[,Q]=N?N.sort.split(":"):"ASC",{push:o,location:{pathname:Y}}=(0,r.useHistory)(),{trackUsage:w}=(0,l.useTracking)(),J=d.sort((s,K)=>{const G=s.name.localeCompare(K.name);return Q==="DESC"?-G:G});return e.createElement(l.DynamicTable,{headers:i,contentType:T,rows:d,withBulkActions:A,isLoading:y,onConfirmDelete:f},e.createElement(B.p,null,J.map(s=>e.createElement(P.Tr,{key:s.id,...(0,l.onRowClick)({fn(){w("willEditTokenFromList"),o(`${Y}/${s.id}`)},condition:p})},e.createElement(g.Td,null,e.createElement(u.Z,{textColor:"neutral800",fontWeight:"bold"},s.name)),e.createElement(g.Td,{maxWidth:(0,l.pxToRem)(250)},e.createElement(u.Z,{textColor:"neutral800",ellipsis:!0},s.description)),e.createElement(g.Td,null,e.createElement(u.Z,{textColor:"neutral800"},e.createElement(l.RelativeTime,{timestamp:new Date(s.createdAt)}))),e.createElement(g.Td,null,s.lastUsedAt&&e.createElement(u.Z,{textColor:"neutral800"},e.createElement(l.RelativeTime,{timestamp:new Date(s.lastUsedAt)}))),A&&e.createElement(g.Td,null,e.createElement(U.k,{justifyContent:"end"},p&&e.createElement(k,{tokenName:s.name,tokenId:s.id}),!p&&b&&e.createElement(c,{tokenName:s.name,tokenId:s.id}),S&&e.createElement(x,{tokenName:s.name,onClickDelete:()=>f(s.id)})))))))};v.propTypes={tokens:n().array,permissions:n().shape({canRead:n().bool,canDelete:n().bool,canUpdate:n().bool}).isRequired,headers:n().arrayOf(n().shape({cellFormatter:n().func,key:n().string.isRequired,metadatas:n().shape({label:n().string.isRequired,sortable:n().bool}).isRequired,name:n().string.isRequired})),contentType:n().string.isRequired,isLoading:n().bool,onConfirmDelete:n().func},v.defaultProps={tokens:[],headers:[],isLoading:!1,onConfirmDelete(){}};var O=v},38286:function(j,C,t){t.r(C),t.d(C,{default:function(){return F}});var e=t(32735),r=t(88425),R=t(72041),n=t(5636),u=t(84968),B=t(5141),P=t(33348),g=t.n(P),U=t(28356),l=t(17e3),I=t(27649),V=t(41415),D=t(19406),L=[{name:"name",key:"name",metadatas:{label:{id:"Settings.transferTokens.ListView.headers.name",defaultMessage:"Name"},sortable:!0}},{name:"description",key:"description",metadatas:{label:{id:"Settings.transferTokens.ListView.headers.description",defaultMessage:"Description"},sortable:!1}},{name:"createdAt",key:"createdAt",metadatas:{label:{id:"Settings.transferTokens.ListView.headers.createdAt",defaultMessage:"Created at"},sortable:!1}},{name:"lastUsedAt",key:"lastUsedAt",metadatas:{label:{id:"Settings.transferTokens.ListView.headers.lastUsedAt",defaultMessage:"Last used"},sortable:!1}}],x=t(81450),$=()=>{(0,r.useFocusWhenNavigate)();const h=(0,u.useQueryClient)(),{formatMessage:m}=(0,n.useIntl)(),E=(0,r.useNotification)(),{allowedActions:{canCreate:k,canDelete:H,canUpdate:M,canRead:c}}=(0,r.useRBAC)(R.Z.settings["transfer-tokens"]),{push:v}=(0,B.useHistory)(),{startSection:O}=(0,r.useGuidedTour)(),a=(0,e.useRef)(O),{get:i,del:T}=(0,r.useFetchClient)();(0,e.useEffect)(()=>{a.current&&a.current("transferTokens")},[]),(0,e.useEffect)(()=>{v({search:g().stringify({sort:"name:ASC"},{encode:!1})})},[v]);const y=L.map(o=>({...o,metadatas:{...o.metadatas,label:m(o.metadatas.label)}})),{data:d,status:f,isFetching:S}=(0,u.useQuery)(["transfer-tokens"],async()=>{const{data:{data:o}}=await i("/admin/transfer/tokens");return o},{enabled:c,onError(){E({type:"warning",message:{id:"notification.error",defaultMessage:"An error occured"}})}}),p=c&&(f!=="success"&&f!=="error"||f==="success"&&S),b=(0,u.useMutation)(async o=>{await T(`/admin/transfer/tokens/${o}`)},{async onSuccess(){await h.invalidateQueries(["transfer-tokens"])},onError(o){o?.response?.data?.data?E({type:"warning",message:o.response.data.data}):E({type:"warning",message:{id:"notification.error",defaultMessage:"An error occured"}})}}),A=c&&d,N=c&&!d&&!k,Q=c&&!d&&k;return e.createElement(I.o,{"aria-busy":p},e.createElement(r.SettingsPageTitle,{name:"Transfer Tokens"}),e.createElement(U.T,{title:m({id:"Settings.transferTokens.title",defaultMessage:"Transfer Tokens"}),subtitle:m({id:"Settings.transferTokens.description",defaultMessage:'"List of generated transfer tokens"'}),primaryAction:k?e.createElement(r.LinkButton,{"data-testid":"create-transfer-token-button",startIcon:e.createElement(D.default,null),size:"S",to:"/settings/transfer-tokens/create"},m({id:"Settings.transferTokens.create",defaultMessage:"Create new Transfer Token"})):void 0}),e.createElement(l.D,null,!c&&e.createElement(r.NoPermissions,null),A&&e.createElement(x.Z,{permissions:{canRead:c,canDelete:H,canUpdate:M},headers:y,contentType:"trasfer-tokens",rows:d,isLoading:p,onConfirmDelete:o=>b.mutateAsync(o),tokens:d}),Q&&e.createElement(r.NoContent,{content:{id:"Settings.transferTokens.addFirstToken",defaultMessage:"Add your first Transfer Token"},action:e.createElement(V.z,{variant:"secondary",startIcon:e.createElement(D.default,null)},m({id:"Settings.transferTokens.addNewToken",defaultMessage:"Add new Transfer Token"}))}),N&&e.createElement(r.NoContent,{content:{id:"Settings.transferTokens.emptyStateLayout",defaultMessage:"You don\u2019t have any content yet..."}})))},F=()=>e.createElement(r.CheckPagePermissions,{permissions:R.Z.settings["transfer-tokens"].main},e.createElement($,null))}}]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/admin",
3
- "version": "4.6.1",
3
+ "version": "4.7.0-beta.0",
4
4
  "description": "Strapi Admin",
5
5
  "repository": {
6
6
  "type": "git",
@@ -46,15 +46,15 @@
46
46
  "@casl/ability": "^5.4.3",
47
47
  "@fingerprintjs/fingerprintjs": "3.3.6",
48
48
  "@pmmmwh/react-refresh-webpack-plugin": "0.5.10",
49
- "@strapi/babel-plugin-switch-ee-ce": "4.6.1",
50
- "@strapi/data-transfer": "4.6.1",
49
+ "@strapi/babel-plugin-switch-ee-ce": "4.7.0-beta.0",
50
+ "@strapi/data-transfer": "4.7.0-beta.0",
51
51
  "@strapi/design-system": "1.6.3",
52
- "@strapi/helper-plugin": "4.6.1",
52
+ "@strapi/helper-plugin": "4.7.0-beta.0",
53
53
  "@strapi/icons": "1.6.3",
54
- "@strapi/permissions": "4.6.1",
55
- "@strapi/provider-audit-logs-local": "4.6.1",
56
- "@strapi/typescript-utils": "4.6.1",
57
- "@strapi/utils": "4.6.1",
54
+ "@strapi/permissions": "4.7.0-beta.0",
55
+ "@strapi/provider-audit-logs-local": "4.7.0-beta.0",
56
+ "@strapi/typescript-utils": "4.7.0-beta.0",
57
+ "@strapi/utils": "4.7.0-beta.0",
58
58
  "axios": "1.2.2",
59
59
  "babel-loader": "^9.1.2",
60
60
  "babel-plugin-styled-components": "2.0.2",
@@ -100,7 +100,6 @@
100
100
  "markdown-it-sup": "1.0.0",
101
101
  "match-sorter": "^4.0.2",
102
102
  "mini-css-extract-plugin": "2.7.2",
103
- "msw": "0.49.1",
104
103
  "node-polyfill-webpack-plugin": "2.0.1",
105
104
  "node-schedule": "2.1.0",
106
105
  "p-map": "4.0.0",
@@ -118,12 +117,12 @@
118
117
  "react-intl": "6.2.7",
119
118
  "react-is": "^17.0.2",
120
119
  "react-query": "3.24.3",
121
- "react-redux": "7.2.8",
120
+ "react-redux": "8.0.5",
122
121
  "react-refresh": "0.14.0",
123
122
  "react-router": "5.2.0",
124
123
  "react-router-dom": "5.3.4",
125
124
  "react-window": "1.8.7",
126
- "redux": "^4.0.1",
125
+ "redux": "^4.2.1",
127
126
  "reselect": "^4.0.0",
128
127
  "rimraf": "3.0.2",
129
128
  "sanitize-html": "2.7.3",
@@ -145,6 +144,7 @@
145
144
  "@testing-library/user-event": "14.4.3",
146
145
  "duplicate-dependencies-webpack-plugin": "^1.0.2",
147
146
  "glob": "8.0.3",
147
+ "msw": "1.0.0",
148
148
  "react-test-renderer": "^17.0.2",
149
149
  "speed-measure-webpack-plugin": "1.5.0",
150
150
  "webpack-bundle-analyzer": "^4.7.0"
@@ -165,5 +165,5 @@
165
165
  }
166
166
  }
167
167
  },
168
- "gitHead": "17a7845e3d453ea2e7911bda6ec25ed196dd5f16"
168
+ "gitHead": "880ba7af867ad43c4cc45b47467b76a9b5606b6e"
169
169
  }
@@ -78,6 +78,7 @@ module.exports = async () => {
78
78
  const userService = getService('user');
79
79
  const roleService = getService('role');
80
80
  const apiTokenService = getService('api-token');
81
+ const transferService = getService('transfer');
81
82
  const tokenService = getService('token');
82
83
 
83
84
  await roleService.createRolesIfNoneExist();
@@ -93,5 +94,6 @@ module.exports = async () => {
93
94
  await syncAPITokensPermissions();
94
95
 
95
96
  apiTokenService.checkSaltIsDefined();
97
+ transferService.token.checkSaltIsDefined();
96
98
  tokenService.checkSecretIsDefined();
97
99
  };
@@ -180,5 +180,53 @@ module.exports = {
180
180
  section: 'settings',
181
181
  category: 'project',
182
182
  },
183
+ {
184
+ uid: 'transfer.tokens.access',
185
+ displayName: 'Access the transfer tokens settings page',
186
+ pluginName: 'admin',
187
+ section: 'settings',
188
+ category: 'transfer tokens',
189
+ subCategory: 'transfer tokens',
190
+ },
191
+ {
192
+ uid: 'transfer.tokens.create',
193
+ displayName: 'Create (generate)',
194
+ pluginName: 'admin',
195
+ section: 'settings',
196
+ category: 'transfer tokens',
197
+ subCategory: 'general',
198
+ },
199
+ {
200
+ uid: 'transfer.tokens.read',
201
+ displayName: 'Read',
202
+ pluginName: 'admin',
203
+ section: 'settings',
204
+ category: 'transfer tokens',
205
+ subCategory: 'general',
206
+ },
207
+ {
208
+ uid: 'transfer.tokens.update',
209
+ displayName: 'Update',
210
+ pluginName: 'admin',
211
+ section: 'settings',
212
+ category: 'transfer tokens',
213
+ subCategory: 'general',
214
+ },
215
+ {
216
+ uid: 'transfer.tokens.regenerate',
217
+ displayName: 'Regenerate',
218
+ pluginName: 'admin',
219
+ section: 'settings',
220
+ category: 'transfer tokens',
221
+ subCategory: 'general',
222
+ },
223
+ {
224
+ uid: 'transfer.tokens.delete',
225
+ displayName: 'Delete (revoke)',
226
+ pluginName: 'admin',
227
+ section: 'settings',
228
+ category: 'transfer tokens',
229
+ subCategory: 'general',
230
+ },
183
231
  ],
184
232
  };
@@ -6,4 +6,6 @@ module.exports = {
6
6
  role: { schema: require('./Role') },
7
7
  'api-token': { schema: require('./api-token') },
8
8
  'api-token-permission': { schema: require('./api-token-permission') },
9
+ 'transfer-token': { schema: require('./transfer-token') },
10
+ 'transfer-token-permission': { schema: require('./transfer-token-permission') },
9
11
  };
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ module.exports = {
4
+ collectionName: 'strapi_transfer_token_permissions',
5
+ info: {
6
+ name: 'Transfer Token Permission',
7
+ description: '',
8
+ singularName: 'transfer-token-permission',
9
+ pluralName: 'transfer-token-permissions',
10
+ displayName: 'Transfer Token Permission',
11
+ },
12
+ options: {},
13
+ pluginOptions: {
14
+ 'content-manager': {
15
+ visible: false,
16
+ },
17
+ 'content-type-builder': {
18
+ visible: false,
19
+ },
20
+ },
21
+ attributes: {
22
+ action: {
23
+ type: 'string',
24
+ minLength: 1,
25
+ configurable: false,
26
+ required: true,
27
+ },
28
+ token: {
29
+ configurable: false,
30
+ type: 'relation',
31
+ relation: 'manyToOne',
32
+ inversedBy: 'permissions',
33
+ target: 'admin::transfer-token',
34
+ },
35
+ },
36
+ };
@@ -0,0 +1,66 @@
1
+ 'use strict';
2
+
3
+ module.exports = {
4
+ collectionName: 'strapi_transfer_tokens',
5
+ info: {
6
+ name: 'Transfer Token',
7
+ singularName: 'transfer-token',
8
+ pluralName: 'transfer-tokens',
9
+ displayName: 'Transfer Token',
10
+ description: '',
11
+ },
12
+ options: {},
13
+ pluginOptions: {
14
+ 'content-manager': {
15
+ visible: false,
16
+ },
17
+ 'content-type-builder': {
18
+ visible: false,
19
+ },
20
+ },
21
+ attributes: {
22
+ name: {
23
+ type: 'string',
24
+ minLength: 1,
25
+ configurable: false,
26
+ required: true,
27
+ unique: true,
28
+ },
29
+ description: {
30
+ type: 'string',
31
+ minLength: 1,
32
+ configurable: false,
33
+ required: false,
34
+ default: '',
35
+ },
36
+ accessKey: {
37
+ type: 'string',
38
+ minLength: 1,
39
+ configurable: false,
40
+ required: true,
41
+ },
42
+ lastUsedAt: {
43
+ type: 'datetime',
44
+ configurable: false,
45
+ required: false,
46
+ },
47
+ permissions: {
48
+ type: 'relation',
49
+ target: 'admin::transfer-token-permission',
50
+ relation: 'oneToMany',
51
+ mappedBy: 'token',
52
+ configurable: false,
53
+ required: false,
54
+ },
55
+ expiresAt: {
56
+ type: 'datetime',
57
+ configurable: false,
58
+ required: false,
59
+ },
60
+ lifespan: {
61
+ type: 'biginteger',
62
+ configurable: false,
63
+ required: false,
64
+ },
65
+ },
66
+ };
@@ -2,8 +2,7 @@
2
2
 
3
3
  const { stringEquals } = require('@strapi/utils/lib');
4
4
  const { ApplicationError } = require('@strapi/utils').errors;
5
- const { trim } = require('lodash/fp');
6
- const has = require('lodash/has');
5
+ const { trim, has } = require('lodash/fp');
7
6
  const { getService } = require('../utils');
8
7
  const {
9
8
  validateApiTokenCreationInput,
@@ -93,11 +92,11 @@ module.exports = {
93
92
  * - having a space at the end or start of the value.
94
93
  * - having only spaces as value;
95
94
  */
96
- if (has(attributes, 'name')) {
95
+ if (has('name', attributes)) {
97
96
  attributes.name = trim(body.name);
98
97
  }
99
98
 
100
- if (has(attributes, 'description') || attributes.description === null) {
99
+ if (has('description', attributes) || attributes.description === null) {
101
100
  attributes.description = trim(body.description);
102
101
  }
103
102
 
@@ -108,7 +107,7 @@ module.exports = {
108
107
  return ctx.notFound('API Token not found');
109
108
  }
110
109
 
111
- if (has(attributes, 'name')) {
110
+ if (has('name', attributes)) {
112
111
  const nameAlreadyTaken = await apiTokenService.getByName(attributes.name);
113
112
 
114
113
  /**
@@ -7,6 +7,7 @@ module.exports = {
7
7
  authentication: require('./authentication'),
8
8
  permission: require('./permission'),
9
9
  role: require('./role'),
10
+ transfer: require('./transfer'),
10
11
  user: require('./user'),
11
12
  webhooks: require('./webhooks'),
12
13
  'content-api': require('./content-api'),
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ const { mapKeys } = require('lodash/fp');
4
+
5
+ const runner = require('./runner');
6
+ const token = require('./token');
7
+
8
+ const prefixActionsName = (prefix, dict) => mapKeys((key) => `${prefix}-${key}`, dict);
9
+
10
+ module.exports = {
11
+ ...prefixActionsName('runner', runner),
12
+ ...prefixActionsName('token', token),
13
+ };
@@ -0,0 +1,24 @@
1
+ 'use strict';
2
+
3
+ const { remote } = require('@strapi/data-transfer/lib/strapi');
4
+ const { UnauthorizedError } = require('@strapi/utils/lib/errors');
5
+
6
+ const dataTransferAuthStrategy = require('../../strategies/data-transfer');
7
+
8
+ /**
9
+ * @param {import('koa').Context} ctx
10
+ * @param {string} [scope]
11
+ */
12
+ const verify = async (ctx, scope) => {
13
+ const { auth } = ctx.state;
14
+
15
+ if (!auth) {
16
+ throw new UnauthorizedError();
17
+ }
18
+
19
+ await dataTransferAuthStrategy.verify(auth, { scope });
20
+ };
21
+
22
+ module.exports = {
23
+ connect: remote.handlers.createTransferHandler({ verify }),
24
+ };
@@ -0,0 +1,131 @@
1
+ 'use strict';
2
+
3
+ const { trim, has } = require('lodash/fp');
4
+ const {
5
+ errors: { ApplicationError },
6
+ stringEquals,
7
+ } = require('@strapi/utils');
8
+
9
+ const {
10
+ token: { validateTransferTokenCreationInput, validateTransferTokenUpdateInput },
11
+ } = require('../../validation/transfer');
12
+ const { getService } = require('../../utils');
13
+
14
+ module.exports = {
15
+ async list(ctx) {
16
+ const transferService = getService('transfer');
17
+ const transferTokens = await transferService.token.list();
18
+
19
+ ctx.body = { data: transferTokens };
20
+ },
21
+
22
+ async getById(ctx) {
23
+ const { id } = ctx.params;
24
+ const tokenService = getService('transfer').token;
25
+
26
+ const transferToken = await tokenService.getById(id);
27
+
28
+ if (!transferToken) {
29
+ ctx.notFound('Transfer token not found');
30
+ return;
31
+ }
32
+
33
+ ctx.body = { data: transferToken };
34
+ },
35
+
36
+ async create(ctx) {
37
+ const { body } = ctx.request;
38
+ const { token: tokenService } = getService('transfer');
39
+
40
+ /**
41
+ * We trim fields to avoid having issues with either:
42
+ * - having a space at the end or start of the value
43
+ * - having only spaces as value (so that an empty field can be caught in validation)
44
+ */
45
+ const attributes = {
46
+ name: trim(body.name),
47
+ description: trim(body.description),
48
+ permissions: body.permissions,
49
+ lifespan: body.lifespan,
50
+ };
51
+
52
+ await validateTransferTokenCreationInput(attributes);
53
+
54
+ const alreadyExists = await tokenService.exists({ name: attributes.name });
55
+ if (alreadyExists) {
56
+ throw new ApplicationError('Name already taken');
57
+ }
58
+
59
+ const transferTokens = await tokenService.create(attributes);
60
+
61
+ ctx.created({ data: transferTokens });
62
+ },
63
+
64
+ async update(ctx) {
65
+ const { body } = ctx.request;
66
+ const { id } = ctx.params;
67
+ const { token: tokenService } = getService('transfer');
68
+
69
+ const attributes = body;
70
+ /**
71
+ * We trim fields to avoid having issues with either:
72
+ * - having a space at the end or start of the value
73
+ * - having only spaces as value (so that an empty field can be caught in validation)
74
+ */
75
+ if (has('name', attributes)) {
76
+ attributes.name = trim(body.name);
77
+ }
78
+
79
+ if (has('description', attributes) || attributes.description === null) {
80
+ attributes.description = trim(body.description);
81
+ }
82
+
83
+ await validateTransferTokenUpdateInput(attributes);
84
+
85
+ const apiTokenExists = await tokenService.getById(id);
86
+ if (!apiTokenExists) {
87
+ return ctx.notFound('Transfer token not found');
88
+ }
89
+
90
+ if (has('name', attributes)) {
91
+ const nameAlreadyTaken = await tokenService.getByName(attributes.name);
92
+
93
+ /**
94
+ * We cast the ids as string as the one coming from the ctx isn't cast
95
+ * as a Number in case it is supposed to be an integer. It remains
96
+ * as a string. This way we avoid issues with integers in the db.
97
+ */
98
+ if (!!nameAlreadyTaken && !stringEquals(nameAlreadyTaken.id, id)) {
99
+ throw new ApplicationError('Name already taken');
100
+ }
101
+ }
102
+
103
+ const apiToken = await tokenService.update(id, attributes);
104
+
105
+ ctx.body = { data: apiToken };
106
+ },
107
+
108
+ async revoke(ctx) {
109
+ const { id } = ctx.params;
110
+ const { token: tokenService } = getService('transfer');
111
+
112
+ const transferToken = await tokenService.revoke(id);
113
+
114
+ ctx.deleted({ data: transferToken });
115
+ },
116
+
117
+ async regenerate(ctx) {
118
+ const { id } = ctx.params;
119
+ const { token: tokenService } = getService('transfer');
120
+
121
+ const exists = await tokenService.getById(id);
122
+ if (!exists) {
123
+ ctx.notFound('Transfer token not found');
124
+ return;
125
+ }
126
+
127
+ const accessToken = await tokenService.regenerate(id);
128
+
129
+ ctx.created({ data: accessToken });
130
+ },
131
+ };
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
- // const { register: registerDataTransferRoute } = require('@strapi/data-transfer/lib/strapi');
4
-
5
3
  const registerAdminPanelRoute = require('./routes/serve-admin-panel');
4
+
6
5
  const adminAuthStrategy = require('./strategies/admin');
6
+
7
7
  const apiTokenAuthStrategy = require('./strategies/api-token');
8
8
 
9
9
  module.exports = ({ strapi }) => {
@@ -16,11 +16,4 @@ module.exports = ({ strapi }) => {
16
16
  if (strapi.config.serveAdminPanel) {
17
17
  registerAdminPanelRoute({ strapi });
18
18
  }
19
-
20
- // if (
21
- // process.env.STRAPI_EXPERIMENTAL === 'true' &&
22
- // process.env.STRAPI_DISABLE_REMOTE_DATA_TRANSFER !== 'true'
23
- // ) {
24
- // registerDataTransferRoute(strapi);
25
- // }
26
19
  };
@@ -8,6 +8,7 @@ const roles = require('./roles');
8
8
  const webhooks = require('./webhooks');
9
9
  const apiTokens = require('./api-tokens');
10
10
  const contentApi = require('./content-api');
11
+ const transfer = require('./transfer');
11
12
 
12
13
  module.exports = [
13
14
  ...admin,
@@ -18,4 +19,5 @@ module.exports = [
18
19
  ...webhooks,
19
20
  ...apiTokens,
20
21
  ...contentApi,
22
+ ...transfer,
21
23
  ];