diff --git a/samples/musicfestival-backend-dotnet/MusicFestival.Backend.csproj b/samples/musicfestival-backend-dotnet/MusicFestival.Backend.csproj
index e17541c..887b07c 100644
--- a/samples/musicfestival-backend-dotnet/MusicFestival.Backend.csproj
+++ b/samples/musicfestival-backend-dotnet/MusicFestival.Backend.csproj
@@ -8,12 +8,12 @@
-
-
-
-
+
+
+
+
-
+
diff --git a/samples/musicfestival-backend-dotnet/Startup.cs b/samples/musicfestival-backend-dotnet/Startup.cs
index 99ec729..e332e55 100644
--- a/samples/musicfestival-backend-dotnet/Startup.cs
+++ b/samples/musicfestival-backend-dotnet/Startup.cs
@@ -39,7 +39,7 @@ public void ConfigureServices(IServiceCollection services)
User=sa;Password=Admin123!;
Trust Server Certificate=True;Connect Timeout=30";
var connectionstring = _configuration.GetConnectionString("EPiServerDB")
- ?? (isMacOs? macOsConnString: localDBConnString);
+ ?? (isMacOs ? macOsConnString : localDBConnString);
services.Configure(o =>
{
o.SetConnectionString(connectionstring);
@@ -133,7 +133,10 @@ public void ConfigureServices(IServiceCollection services)
o.IncludeNumericContentIdentifier = true;
});
- services.AddContentGraph(_configuration, OpenIDConnectOptionsDefaults.AuthenticationScheme);
+ services.AddContentGraph(OpenIDConnectOptionsDefaults.AuthenticationScheme, options =>
+ {
+ options.EnablePreviewTokens = true;
+ });
services.AddHostedService();
}
@@ -147,7 +150,7 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
app.UseStaticFiles();
app.UseRouting();
app.UseCors(b => b
- .WithOrigins(new[] { $"{_frontendUri}"})
+ .WithOrigins(new[] { $"{_frontendUri}" })
.WithExposedContentDeliveryApiHeaders()
.WithExposedContentDefinitionApiHeaders()
.WithHeaders("Authorization")
diff --git a/samples/musicfestival-frontend-react/.env b/samples/musicfestival-frontend-react/.env
index 0ea85b1..99fcc7c 100644
--- a/samples/musicfestival-frontend-react/.env
+++ b/samples/musicfestival-frontend-react/.env
@@ -1,4 +1,4 @@
-REACT_APP_CG_PROXY_URL=http://localhost:8082/EpiServer/ContentGraph/CGProxy/Query
+REACT_APP_CG_PREVIEW_URL=https://cg.optimizely.com/content/v2
REACT_APP_CONTENT_GRAPH_GATEWAY_URL=https://cg.optimizely.com/content/v2?auth=INPUT_SINGLE_KEY_HERE
REACT_APP_LOGIN_AUTHORITY=http://localhost:8082
diff --git a/samples/musicfestival-frontend-react/src/App.tsx b/samples/musicfestival-frontend-react/src/App.tsx
index a427f57..67d3673 100644
--- a/samples/musicfestival-frontend-react/src/App.tsx
+++ b/samples/musicfestival-frontend-react/src/App.tsx
@@ -5,7 +5,7 @@ import ArtistContainerPage from './pages/ArtistContainerPage';
import ArtistDetailsPage from './pages/ArtistDetailsPage';
import authService from './authService';
import { useState } from 'react';
-import { isEditOrPreviewMode } from './helpers/urlHelper'
+import { isEditOrPreviewMode, getPreviewTokenFromUrl } from './helpers/urlHelper'
import './App.css';
import Footer from './components/Footer';
import { useMutation, useQueryClient } from '@tanstack/react-query';
@@ -16,7 +16,7 @@ import { BlockPage } from './pages/BlockPage';
let previousSavedMessage: any = null;
const singleKeyUrl = process.env.REACT_APP_CONTENT_GRAPH_GATEWAY_URL as string
-const hmacKeyUrl = process.env.REACT_APP_CG_PROXY_URL as string
+const previewUrl = process.env.REACT_APP_CG_PREVIEW_URL as string
const App = () => {
const queryClient = useQueryClient();
@@ -36,21 +36,18 @@ const App = () => {
}
});
- authService.getAccessToken().then((_token) => {
- _token && setToken(_token)
- modeEdit && !_token && !data && authService.login()
- })
+ const previewToken = getPreviewTokenFromUrl(window.location.search);
- variables = generateGQLQueryVars(token, window.location.pathname)
+ variables = generateGQLQueryVars(previewToken, window.location.pathname)
if (modeEdit) {
- if (token) {
- headers = { 'Authorization': 'Bearer ' + token };
+ if (previewToken) {
+ headers = { 'Authorization': 'Bearer ' + previewToken };
}
- url = hmacKeyUrl
+ url = previewUrl
subcribeContentSavedEvent((message: any) => mutate(message))
}
- const { data: queryData } = useStartQuery({ endpoint: url, fetchParams: { headers: headers } }, variables, { staleTime: 2000, enabled: !modeEdit || !!token });
+ const { data: queryData } = useStartQuery({ endpoint: url, fetchParams: { headers: headers } }, variables, { staleTime: 2000, enabled: !modeEdit || !!previewToken });
data = queryData
if (!data) {
diff --git a/samples/musicfestival-frontend-react/src/components/SearchButton.tsx b/samples/musicfestival-frontend-react/src/components/SearchButton.tsx
index b94b359..a9c3b45 100644
--- a/samples/musicfestival-frontend-react/src/components/SearchButton.tsx
+++ b/samples/musicfestival-frontend-react/src/components/SearchButton.tsx
@@ -2,7 +2,7 @@ import {useEffect, useRef, useState} from "react";
import {useSearchParams} from "react-router-dom";
import {ArtistAutocompleteQuery, Ranking, useArtistAutocompleteQuery} from "../generated";
import {generateGQLSearchQueryVars} from "../helpers/queryCacheHelper";
-import {getRankingFromSearchParams, isEditOrPreviewMode} from "../helpers/urlHelper";
+import {getRankingFromSearchParams, isEditOrPreviewMode, getPreviewTokenFromUrl } from "../helpers/urlHelper";
type CustomString = string | number | readonly string[] | undefined
@@ -18,10 +18,12 @@ function SearchButton({filterValue}: any): JSX.Element {
const [orderBy] = useState("ASC")
let modeEdit = isEditOrPreviewMode()
- let variables = generateGQLSearchQueryVars(token, window.location.pathname, searchValue as string | null, orderBy, ranking);
+ const previewToken = getPreviewTokenFromUrl(window.location.search);
+
+ let variables = generateGQLSearchQueryVars(previewToken, window.location.pathname, searchValue as string | null, orderBy, ranking);
const autocompleteData = useArtistAutocompleteQuery({endpoint: singleKeyUrl}, variables, {
staleTime: 2000,
- enabled: !modeEdit || !!token
+ enabled: !modeEdit || !!previewToken
}).data;
const onSearch = (event: any) => {
diff --git a/samples/musicfestival-frontend-react/src/generated.ts b/samples/musicfestival-frontend-react/src/generated.ts
index 279e77d..814841f 100644
--- a/samples/musicfestival-frontend-react/src/generated.ts
+++ b/samples/musicfestival-frontend-react/src/generated.ts
@@ -52,6 +52,7 @@ export type ArtistContainerPage = IContent & {
RelativePath?: Maybe;
RouteSegment?: Maybe;
Saved?: Maybe;
+ SiteId?: Maybe;
StartPublish?: Maybe;
Status?: Maybe;
StopPublish?: Maybe;
@@ -59,10 +60,16 @@ export type ArtistContainerPage = IContent & {
_children?: Maybe;
_deleted?: Maybe;
_fulltext?: Maybe>>;
+ _link?: Maybe;
_modified?: Maybe;
_score?: Maybe;
};
+
+export type ArtistContainerPage_LinkArgs = {
+ type?: InputMaybe;
+};
+
export type ArtistContainerPageAutocomplete = {
__typename?: 'ArtistContainerPageAutocomplete';
Ancestors?: Maybe>>;
@@ -75,6 +82,7 @@ export type ArtistContainerPageAutocomplete = {
ParentLink?: Maybe;
RelativePath?: Maybe>>;
RouteSegment?: Maybe>>;
+ SiteId?: Maybe>>;
Status?: Maybe>>;
Url?: Maybe>>;
};
@@ -104,6 +112,12 @@ export type ArtistContainerPageAutocompleteRouteSegmentArgs = {
};
+export type ArtistContainerPageAutocompleteSiteIdArgs = {
+ limit?: Scalars['Int'];
+ value: Scalars['String'];
+};
+
+
export type ArtistContainerPageAutocompleteStatusArgs = {
limit?: Scalars['Int'];
value: Scalars['String'];
@@ -132,6 +146,7 @@ export type ArtistContainerPageFacet = {
RelativePath?: Maybe>>;
RouteSegment?: Maybe>>;
Saved?: Maybe>>;
+ SiteId?: Maybe>>;
StartPublish?: Maybe>>;
Status?: Maybe>>;
StopPublish?: Maybe>>;
@@ -205,6 +220,14 @@ export type ArtistContainerPageFacetSavedArgs = {
};
+export type ArtistContainerPageFacetSiteIdArgs = {
+ filters?: InputMaybe>;
+ limit?: Scalars['Int'];
+ orderBy?: InputMaybe;
+ orderType?: InputMaybe;
+};
+
+
export type ArtistContainerPageFacetStartPublishArgs = {
unit?: InputMaybe;
value?: InputMaybe;
@@ -248,6 +271,7 @@ export type ArtistContainerPageOrderByInput = {
RelativePath?: InputMaybe;
RouteSegment?: InputMaybe;
Saved?: InputMaybe;
+ SiteId?: InputMaybe;
StartPublish?: InputMaybe;
Status?: InputMaybe;
StopPublish?: InputMaybe;
@@ -285,6 +309,7 @@ export type ArtistContainerPageWhereInput = {
RelativePath?: InputMaybe;
RouteSegment?: InputMaybe;
Saved?: InputMaybe;
+ SiteId?: InputMaybe;
StartPublish?: InputMaybe;
Status?: InputMaybe;
StopPublish?: InputMaybe;
@@ -321,6 +346,7 @@ export type ArtistDetailsPage = IContent & {
RelativePath?: Maybe;
RouteSegment?: Maybe;
Saved?: Maybe;
+ SiteId?: Maybe;
StageName?: Maybe;
StartPublish?: Maybe;
Status?: Maybe;
@@ -329,10 +355,16 @@ export type ArtistDetailsPage = IContent & {
_children?: Maybe;
_deleted?: Maybe;
_fulltext?: Maybe>>;
+ _link?: Maybe;
_modified?: Maybe;
_score?: Maybe;
};
+
+export type ArtistDetailsPage_LinkArgs = {
+ type?: InputMaybe;
+};
+
export type ArtistDetailsPageAutocomplete = {
__typename?: 'ArtistDetailsPageAutocomplete';
Ancestors?: Maybe>>;
@@ -349,6 +381,7 @@ export type ArtistDetailsPageAutocomplete = {
ParentLink?: Maybe;
RelativePath?: Maybe>>;
RouteSegment?: Maybe>>;
+ SiteId?: Maybe>>;
StageName?: Maybe>>;
Status?: Maybe>>;
Url?: Maybe>>;
@@ -403,6 +436,12 @@ export type ArtistDetailsPageAutocompleteRouteSegmentArgs = {
};
+export type ArtistDetailsPageAutocompleteSiteIdArgs = {
+ limit?: Scalars['Int'];
+ value: Scalars['String'];
+};
+
+
export type ArtistDetailsPageAutocompleteStageNameArgs = {
limit?: Scalars['Int'];
value: Scalars['String'];
@@ -444,6 +483,7 @@ export type ArtistDetailsPageFacet = {
RelativePath?: Maybe>>;
RouteSegment?: Maybe>>;
Saved?: Maybe>>;
+ SiteId?: Maybe>>;
StageName?: Maybe>>;
StartPublish?: Maybe>>;
Status?: Maybe>>;
@@ -570,6 +610,14 @@ export type ArtistDetailsPageFacetSavedArgs = {
};
+export type ArtistDetailsPageFacetSiteIdArgs = {
+ filters?: InputMaybe>;
+ limit?: Scalars['Int'];
+ orderBy?: InputMaybe;
+ orderType?: InputMaybe;
+};
+
+
export type ArtistDetailsPageFacetStageNameArgs = {
filters?: InputMaybe>;
limit?: Scalars['Int'];
@@ -628,6 +676,7 @@ export type ArtistDetailsPageOrderByInput = {
RelativePath?: InputMaybe;
RouteSegment?: InputMaybe;
Saved?: InputMaybe;
+ SiteId?: InputMaybe;
StageName?: InputMaybe;
StartPublish?: InputMaybe;
Status?: InputMaybe;
@@ -673,6 +722,7 @@ export type ArtistDetailsPageWhereInput = {
RelativePath?: InputMaybe;
RouteSegment?: InputMaybe;
Saved?: InputMaybe;
+ SiteId?: InputMaybe;
StageName?: InputMaybe;
StartPublish?: InputMaybe;
Status?: InputMaybe;
@@ -771,6 +821,7 @@ export type BuyTicketBlock = IContent & {
RelativePath?: Maybe;
RouteSegment?: Maybe;
Saved?: Maybe;
+ SiteId?: Maybe;
StartPublish?: Maybe;
Status?: Maybe;
StopPublish?: Maybe;
@@ -778,10 +829,16 @@ export type BuyTicketBlock = IContent & {
_children?: Maybe;
_deleted?: Maybe;
_fulltext?: Maybe>>;
+ _link?: Maybe;
_modified?: Maybe;
_score?: Maybe;
};
+
+export type BuyTicketBlock_LinkArgs = {
+ type?: InputMaybe;
+};
+
export type BuyTicketBlockAutocomplete = {
__typename?: 'BuyTicketBlockAutocomplete';
Ancestors?: Maybe>>;
@@ -796,6 +853,7 @@ export type BuyTicketBlockAutocomplete = {
ParentLink?: Maybe;
RelativePath?: Maybe>>;
RouteSegment?: Maybe>>;
+ SiteId?: Maybe>>;
Status?: Maybe>>;
Url?: Maybe>>;
};
@@ -837,6 +895,12 @@ export type BuyTicketBlockAutocompleteRouteSegmentArgs = {
};
+export type BuyTicketBlockAutocompleteSiteIdArgs = {
+ limit?: Scalars['Int'];
+ value: Scalars['String'];
+};
+
+
export type BuyTicketBlockAutocompleteStatusArgs = {
limit?: Scalars['Int'];
value: Scalars['String'];
@@ -867,6 +931,7 @@ export type BuyTicketBlockFacet = {
RelativePath?: Maybe>>;
RouteSegment?: Maybe>>;
Saved?: Maybe>>;
+ SiteId?: Maybe>>;
StartPublish?: Maybe>>;
Status?: Maybe>>;
StopPublish?: Maybe>>;
@@ -956,6 +1021,14 @@ export type BuyTicketBlockFacetSavedArgs = {
};
+export type BuyTicketBlockFacetSiteIdArgs = {
+ filters?: InputMaybe>;
+ limit?: Scalars['Int'];
+ orderBy?: InputMaybe;
+ orderType?: InputMaybe;
+};
+
+
export type BuyTicketBlockFacetStartPublishArgs = {
unit?: InputMaybe;
value?: InputMaybe;
@@ -1001,6 +1074,7 @@ export type BuyTicketBlockOrderByInput = {
RelativePath?: InputMaybe;
RouteSegment?: InputMaybe;
Saved?: InputMaybe;
+ SiteId?: InputMaybe;
StartPublish?: InputMaybe;
Status?: InputMaybe;
StopPublish?: InputMaybe;
@@ -1040,6 +1114,7 @@ export type BuyTicketBlockWhereInput = {
RelativePath?: InputMaybe;
RouteSegment?: InputMaybe;
Saved?: InputMaybe;
+ SiteId?: InputMaybe;
StartPublish?: InputMaybe;
Status?: InputMaybe;
StopPublish?: InputMaybe;
@@ -1132,6 +1207,7 @@ export type Content = IContent & {
RelativePath?: Maybe;
RouteSegment?: Maybe;
Saved?: Maybe;
+ SiteId?: Maybe;
StartPublish?: Maybe;
Status?: Maybe;
StopPublish?: Maybe;
@@ -1139,14 +1215,21 @@ export type Content = IContent & {
_children?: Maybe;
_deleted?: Maybe;
_fulltext?: Maybe>>;
+ _link?: Maybe;
_modified?: Maybe;
_score?: Maybe;
};
+
+export type Content_LinkArgs = {
+ type?: InputMaybe;
+};
+
export type ContentAreaItemModel = {
__typename?: 'ContentAreaItemModel';
ContentLink?: Maybe;
DisplayOption?: Maybe;
+ InlineBlock?: Maybe;
Tag?: Maybe;
};
@@ -1154,6 +1237,7 @@ export type ContentAreaItemModelAutocomplete = {
__typename?: 'ContentAreaItemModelAutocomplete';
ContentLink?: Maybe;
DisplayOption?: Maybe>>;
+ InlineBlock?: Maybe;
Tag?: Maybe>>;
};
@@ -1173,6 +1257,7 @@ export type ContentAreaItemModelFacet = {
__typename?: 'ContentAreaItemModelFacet';
ContentLink?: Maybe;
DisplayOption?: Maybe>>;
+ InlineBlock?: Maybe;
Tag?: Maybe>>;
};
@@ -1195,12 +1280,14 @@ export type ContentAreaItemModelFacetTagArgs = {
export type ContentAreaItemModelOrderByInput = {
ContentLink?: InputMaybe;
DisplayOption?: InputMaybe;
+ InlineBlock?: InputMaybe;
Tag?: InputMaybe;
};
export type ContentAreaItemModelWhereInput = {
ContentLink?: InputMaybe;
DisplayOption?: InputMaybe;
+ InlineBlock?: InputMaybe;
Tag?: InputMaybe;
};
@@ -1215,6 +1302,7 @@ export type ContentAutocomplete = {
ParentLink?: Maybe;
RelativePath?: Maybe>>;
RouteSegment?: Maybe>>;
+ SiteId?: Maybe>>;
Status?: Maybe>>;
Url?: Maybe>>;
};
@@ -1244,6 +1332,12 @@ export type ContentAutocompleteRouteSegmentArgs = {
};
+export type ContentAutocompleteSiteIdArgs = {
+ limit?: Scalars['Int'];
+ value: Scalars['String'];
+};
+
+
export type ContentAutocompleteStatusArgs = {
limit?: Scalars['Int'];
value: Scalars['String'];
@@ -1275,6 +1369,7 @@ export type ContentBlock = IContent & {
RelativePath?: Maybe;
RouteSegment?: Maybe;
Saved?: Maybe;
+ SiteId?: Maybe;
StartPublish?: Maybe;
Status?: Maybe;
StopPublish?: Maybe;
@@ -1283,10 +1378,16 @@ export type ContentBlock = IContent & {
_children?: Maybe;
_deleted?: Maybe;
_fulltext?: Maybe>>;
+ _link?: Maybe;
_modified?: Maybe;
_score?: Maybe;
};
+
+export type ContentBlock_LinkArgs = {
+ type?: InputMaybe;
+};
+
export type ContentBlockAutocomplete = {
__typename?: 'ContentBlockAutocomplete';
Ancestors?: Maybe>>;
@@ -1302,6 +1403,7 @@ export type ContentBlockAutocomplete = {
ParentLink?: Maybe;
RelativePath?: Maybe>>;
RouteSegment?: Maybe>>;
+ SiteId?: Maybe>>;
Status?: Maybe>>;
Title?: Maybe>>;
Url?: Maybe>>;
@@ -1350,6 +1452,12 @@ export type ContentBlockAutocompleteRouteSegmentArgs = {
};
+export type ContentBlockAutocompleteSiteIdArgs = {
+ limit?: Scalars['Int'];
+ value: Scalars['String'];
+};
+
+
export type ContentBlockAutocompleteStatusArgs = {
limit?: Scalars['Int'];
value: Scalars['String'];
@@ -1387,6 +1495,7 @@ export type ContentBlockFacet = {
RelativePath?: Maybe>>;
RouteSegment?: Maybe>>;
Saved?: Maybe>>;
+ SiteId?: Maybe>>;
StartPublish?: Maybe>>;
Status?: Maybe>>;
StopPublish?: Maybe>>;
@@ -1485,6 +1594,14 @@ export type ContentBlockFacetSavedArgs = {
};
+export type ContentBlockFacetSiteIdArgs = {
+ filters?: InputMaybe>;
+ limit?: Scalars['Int'];
+ orderBy?: InputMaybe;
+ orderType?: InputMaybe;
+};
+
+
export type ContentBlockFacetStartPublishArgs = {
unit?: InputMaybe;
value?: InputMaybe;
@@ -1539,6 +1656,7 @@ export type ContentBlockOrderByInput = {
RelativePath?: InputMaybe;
RouteSegment?: InputMaybe;
Saved?: InputMaybe;
+ SiteId?: InputMaybe;
StartPublish?: InputMaybe;
Status?: InputMaybe;
StopPublish?: InputMaybe;
@@ -1580,6 +1698,7 @@ export type ContentBlockWhereInput = {
RelativePath?: InputMaybe;
RouteSegment?: InputMaybe;
Saved?: InputMaybe;
+ SiteId?: InputMaybe;
StartPublish?: InputMaybe;
Status?: InputMaybe;
StopPublish?: InputMaybe;
@@ -1608,6 +1727,7 @@ export type ContentFacet = {
RelativePath?: Maybe>>;
RouteSegment?: Maybe>>;
Saved?: Maybe>>;
+ SiteId?: Maybe>>;
StartPublish?: Maybe>>;
Status?: Maybe>>;
StopPublish?: Maybe>>;
@@ -1681,6 +1801,14 @@ export type ContentFacetSavedArgs = {
};
+export type ContentFacetSiteIdArgs = {
+ filters?: InputMaybe>;
+ limit?: Scalars['Int'];
+ orderBy?: InputMaybe;
+ orderType?: InputMaybe;
+};
+
+
export type ContentFacetStartPublishArgs = {
unit?: InputMaybe;
value?: InputMaybe;
@@ -1897,6 +2025,7 @@ export type ContentOrderByInput = {
RelativePath?: InputMaybe;
RouteSegment?: InputMaybe;
Saved?: InputMaybe;
+ SiteId?: InputMaybe;
StartPublish?: InputMaybe;
Status?: InputMaybe;
StopPublish?: InputMaybe;
@@ -1981,6 +2110,7 @@ export type ContentWhereInput = {
RelativePath?: InputMaybe;
RouteSegment?: InputMaybe;
Saved?: InputMaybe;
+ SiteId?: InputMaybe;
StartPublish?: InputMaybe