Skip to content

Commit

Permalink
parent 892d4f5
Browse files Browse the repository at this point in the history
author soyuka <soyuka@users.noreply.github.com> 1670024326 +0100
committer soyuka <soyuka@users.noreply.github.com> 1675436410 +0100
gpgsig -----BEGIN PGP SIGNATURE-----

 iQIzBAABCAAdFiEEYtBTVMYUWMuDeP0yP4IpnGT1GtIFAmPdIXoACgkQP4IpnGT1
 GtJPXBAAqdkWZI7ljqcvTWOWPVCZg7HM3TjgMCQbP0yna0nPMWHJ+ZLMKi2MlE2u
 BOGe6XxESevQbloMrd5gufeJ+aKnqvLpD18buoMojam9nBcIRzzWynw7vj2zoUNR
 8lN0nyxGoj2FIO4QvP3ck5fa1WrSDX9q8LKSmXgalGb7H9vVUsHzgDaC0D6sJ3Jy
 lv7p9iEighN73E3v0tNHx0rGvO7XscE3/XRZauwGyG4oyBgaBzx1HBArAiRS9ivu
 Avp/Seyt4g28mxRaHlDNM/7vhC/ZV/lF2u21UX7E2T129u5kg+6V+Uu0/+3WqOJQ
 Ade9YIEqbXRldxnKvPTPlI3UZbSaV4xOeRYwUkaoK7pfB6v5Q08hovjthvLUdgdy
 qWUEH8Pj2+F7pbJkPXT1HsmSrDGMzrV+RRzBjThCc4Ik4X1IERAOLbrGMsOOTePM
 kNdk90c2OnIrnakiz8UPht/7BYu2lSmW1HHjk2AYzMv6oRXdfsd4VcnFKQpfynjl
 Jsx6GR+5Kkdu7KFzvhF3sy59B4Qz0kk+qwHdcYyO/BZBWgts0FdsRxW/YJDdkMT/
 aleNXmGsFrn3G+E4vXbMKNL5B59LuB1i/m/qaAYb8yoGBD5LiM3GaVknM9tBUsOM
 OB0bv/3pyIQjz3le0GKTxAsNNERkksZLUN4sOlDs0Eo7/mIabLo=
 =thCY
 -----END PGP SIGNATURE-----

init docs
  • Loading branch information
soyuka committed Mar 28, 2023
1 parent ccef472 commit 37132e5
Show file tree
Hide file tree
Showing 227 changed files with 29,271 additions and 178 deletions.
68 changes: 68 additions & 0 deletions .github/workflows/doc.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: Documentation

on:
push:
pull_request:

env:
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COVERAGE: '0'
SYMFONY_DEPRECATIONS_HELPER: max[self]=0

jobs:
docs:
name: Generate Documentation
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup PHP with pre-release PECL extension
uses: shivammathur/setup-php@v2
with:
php-version: 8.2
tools: pecl, composer
extensions: intl, bcmath, curl, openssl, mbstring, pdo_sqlite
coverage: none
ini-values: memory_limit=-1
- name: Get composer cache directory
id: composercache
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
shell: bash
- name: Global require pdg
run: |
cd $(composer -n config --global home)
echo "{\"repositories\":[{\"type\":\"vcs\",\"url\":\"https://github.com/php-documentation-generator/php-documentation-generator\"}]}" > composer.json
composer global config --no-plugins allow-plugins.symfony/runtime true
composer global require php-documentation-generator/php-documentation-generator:dev-main
- name: Cache dependencies
uses: actions/cache@v3
with:
path: ${{ steps.composercache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
restore-keys: ${{ runner.os }}-composer-
- name: Update project dependencies
run: composer update --no-interaction --no-progress --ansi

- name: Install phpunit
run: vendor/bin/simple-phpunit --version
- name: Test guides
working-directory: docs
run: |
for d in guide/*.php; do
APP_ENV=test pdg test:guide $d
done
- name: Generate Guides
working-directory: docs
run: |
for d in guide/*.php; do
name=$(basename $d .php);
pdg guide "$d" > "pages/guide/$name.mdx";
done
- name: Generate References
working-directory: docs
run: pdg references > "pages/reference/index.mdx"
- name: Generate Sidebar
working-directory: docs
run: pdg index > "pages/sidebar.mdx"


6 changes: 4 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@
"symfony/web-profiler-bundle": "^6.1",
"symfony/yaml": "^6.1",
"twig/twig": "^1.42.3 || ^2.12 || ^3.0",
"webonyx/graphql-php": "^14.0 || ^15.0"
"webonyx/graphql-php": "^14.0 || ^15.0",
"zenstruck/foundry": "^1.28"
},
"conflict": {
"doctrine/common": "<3.2.2",
Expand Down Expand Up @@ -136,7 +137,8 @@
"sort-packages": true,
"allow-plugins": {
"composer/package-versions-deprecated": true,
"phpstan/extension-installer": true
"phpstan/extension-installer": true,
"symfony/runtime": true
}
},
"extra": {
Expand Down
15 changes: 15 additions & 0 deletions docs/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
pages/guide/**/*.mdx
pages/reference/**/*.mdx
pages/tutorial/**/*.mdx
pages/core
pages/create-client
pages/deployment
pages/distribution
pages/extra
pages/schema-generator
pages/sidebar.mdx
.next
node_modules
composer.lock
vendor
var
92 changes: 92 additions & 0 deletions docs/admin/authentication-support.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# Authentication Support

API Platform Admin delegates the authentication support to React Admin.
Refer to [the chapter dedicated to authentication in the React Admin documentation](https://marmelab.com/react-admin/Authentication.html)
for more information.

In short, you have to tweak the data provider and the API documentation parser like this:

```typescript
// components/admin/Admin.tsx

import Head from "next/head";
import { useState } from "react";
import { Navigate, Route } from "react-router-dom";
import { CustomRoutes } from "react-admin";
import {
fetchHydra as baseFetchHydra,
HydraAdmin,
hydraDataProvider as baseHydraDataProvider,
useIntrospection,
} from "@api-platform/admin";
import { parseHydraDocumentation } from "@api-platform/api-doc-parser";
import authProvider from "utils/authProvider";
import { ENTRYPOINT } from "config/entrypoint";

const getHeaders = () => localStorage.getItem("token") ? {
Authorization: `Bearer ${localStorage.getItem("token")}`,
} : {};
const fetchHydra = (url, options = {}) =>
baseFetchHydra(url, {
...options,
headers: getHeaders,
});
const RedirectToLogin = () => {
const introspect = useIntrospection();

if (localStorage.getItem("token")) {
introspect();
return <></>;
}
return <Navigate to="/login" />;
};
const apiDocumentationParser = (setRedirectToLogin) => async () => {
try {
setRedirectToLogin(false);

return await parseHydraDocumentation(ENTRYPOINT, { headers: getHeaders });
} catch (result) {
const { api, response, status } = result;
if (status !== 401 || !response) {
throw result;
}

// Prevent infinite loop if the token is expired
localStorage.removeItem("token");

setRedirectToLogin(true);

return {
api,
response,
status,
};
}
};
const dataProvider = (setRedirectToLogin) => baseHydraDataProvider({
entrypoint: ENTRYPOINT,
httpClient: fetchHydra,
apiDocumentationParser: apiDocumentationParser(setRedirectToLogin),
});

const Admin = () => {
const [redirectToLogin, setRedirectToLogin] = useState(false);

return (
<>
<Head>
<title>API Platform Admin</title>
</Head>

<HydraAdmin dataProvider={dataProvider(setRedirectToLogin)} authProvider={authProvider} entrypoint={window.origin}>
<CustomRoutes>
{redirectToLogin ? <Route path="/" element={<RedirectToLogin />} /> : null}
</CustomRoutes>
</HydraAdmin>
</>
);
}
export default Admin;
```

For the implementation of the auth provider, you can find a working example in the [API Platform's demo application](https://github.com/api-platform/demo/blob/main/pwa/utils/authProvider.tsx).
Loading

0 comments on commit 37132e5

Please sign in to comment.