Skip to content

Commit a0926c4

Browse files
authored
Merge pull request #4309 from lohxt1/timeline_fixes
oauth2 related fixes
2 parents ef929e7 + b795b1c commit a0926c4

File tree

14 files changed

+177
-47
lines changed

14 files changed

+177
-47
lines changed

packages/bruno-app/src/components/FolderSettings/Auth/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@ const Auth = ({ collection, folder }) => {
4646
case 'oauth2': {
4747
return (
4848
<>
49-
<GrantTypeSelector
49+
<GrantTypeSelector
5050
request={request}
5151
updateAuth={updateFolderAuth}
5252
collection={collection}
53-
folder={folder}
53+
item={folder}
5454
/>
5555
<GrantTypeComponentMap collection={collection} folder={folder} />
5656
</>

packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ const HttpRequestPane = ({ item, collection, leftPaneWidth }) => {
152152
<div className={getTabClassname('script')} role="tab" onClick={() => selectTab('script')}>
153153
Script
154154
{(script.req || script.res) && (
155-
item.preScriptResponseErrorMessage || item.postResponseScriptErrorMessage ?
155+
item.preRequestScriptErrorMessage || item.postResponseScriptErrorMessage ?
156156
<ErrorIndicator /> :
157157
<ContentIndicator />
158158
)}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import styled from 'styled-components';
2+
3+
const StyledWrapper = styled.div`
4+
font-size: 0.8125rem;
5+
color: ${(props) => props.theme.requestTabPanel.responseStatus};
6+
`;
7+
8+
export default StyledWrapper;
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import React from 'react';
2+
import { useDispatch } from 'react-redux';
3+
import StyledWrapper from './StyledWrapper';
4+
import { clearRequestTimeline } from 'providers/ReduxStore/slices/collections/index';
5+
6+
const ClearTimeline = ({ collection, item }) => {
7+
const dispatch = useDispatch();
8+
9+
const clearResponse = () =>
10+
dispatch(
11+
clearRequestTimeline({
12+
itemUid: item.uid,
13+
collectionUid: collection.uid
14+
})
15+
);
16+
17+
return (
18+
<StyledWrapper className="ml-2 flex items-center">
19+
<button onClick={clearResponse} className='text-link hover:underline' title="Clear Timeline">
20+
Clear Timeline
21+
</button>
22+
</StyledWrapper>
23+
);
24+
};
25+
26+
export default ClearTimeline;

packages/bruno-app/src/components/ResponsePane/Timeline/TimelineItem/Common/Time/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export const RelativeTime = ({ timestamp }) => {
2727
useEffect(() => {
2828
const interval = setInterval(() => {
2929
setRelativeTime(getRelativeTime(new Date(timestamp)));
30-
}, 1000);
30+
}, 60000);
3131

3232
return () => clearInterval(interval);
3333
}, [timestamp]);

packages/bruno-app/src/components/ResponsePane/index.js

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import ScriptErrorIcon from './ScriptErrorIcon';
1818
import StyledWrapper from './StyledWrapper';
1919
import ResponseSave from 'src/components/ResponsePane/ResponseSave';
2020
import ResponseClear from 'src/components/ResponsePane/ResponseClear';
21+
import ClearTimeline from './ClearTimeline/index';
2122

2223
const ResponsePane = ({ rightPaneWidth, item, collection }) => {
2324
const dispatch = useDispatch();
@@ -26,6 +27,10 @@ const ResponsePane = ({ rightPaneWidth, item, collection }) => {
2627
const isLoading = ['queued', 'sending'].includes(item.requestState);
2728
const [showScriptErrorCard, setShowScriptErrorCard] = useState(false);
2829

30+
const requestTimeline = ([...(collection.timeline || [])]).filter(obj => {
31+
if (obj.itemUid === item.uid) return true;
32+
});
33+
2934
useEffect(() => {
3035
if (item?.preRequestScriptErrorMessage || item?.postResponseScriptErrorMessage) {
3136
setShowScriptErrorCard(true);
@@ -83,7 +88,7 @@ const ResponsePane = ({ rightPaneWidth, item, collection }) => {
8388
);
8489
}
8590

86-
if (!item.response) {
91+
if (!item.response && !requestTimeline?.length) {
8792
return (
8893
<StyledWrapper className="flex h-full relative">
8994
<Placeholder />
@@ -134,11 +139,17 @@ const ResponsePane = ({ rightPaneWidth, item, collection }) => {
134139
onClick={() => setShowScriptErrorCard(true)}
135140
/>
136141
)}
137-
<ResponseClear item={item} collection={collection} />
138-
<ResponseSave item={item} />
139-
<StatusCode status={response.status} />
140-
<ResponseTime duration={response.duration} />
141-
<ResponseSize size={response.size} />
142+
{focusedTab?.responsePaneTab === "timeline" ? (
143+
<ClearTimeline item={item} collection={collection} />
144+
) : item?.response ? (
145+
<>
146+
<ResponseClear item={item} collection={collection} />
147+
<ResponseSave item={item} />
148+
<StatusCode status={response.status} />
149+
<ResponseTime duration={response.duration} />
150+
<ResponseSize size={response.size} />
151+
</>
152+
) : null}
142153
</div>
143154
) : null}
144155
</div>
@@ -152,7 +163,17 @@ const ResponsePane = ({ rightPaneWidth, item, collection }) => {
152163
onClose={() => setShowScriptErrorCard(false)}
153164
/>
154165
)}
155-
{getTabPanel(focusedTab.responsePaneTab)}
166+
{!item?.response ? (
167+
focusedTab?.responsePaneTab === "timeline" && requestTimeline?.length ? (
168+
<Timeline
169+
collection={collection}
170+
item={item}
171+
width={rightPaneWidth}
172+
/>
173+
) : null
174+
) : (
175+
<>{getTabPanel(focusedTab.responsePaneTab)}</>
176+
)}
156177
</section>
157178
</StyledWrapper>
158179
);

packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1297,12 +1297,13 @@ export const refreshOauth2Credentials = (payload) => async (dispatch, getState)
12971297
return new Promise((resolve, reject) => {
12981298
window.ipcRenderer
12991299
.invoke('renderer:refresh-oauth2-credentials', { request, collection })
1300-
.then(({ credentials, url, collectionUid, debugInfo }) => {
1300+
.then(({ credentials, url, collectionUid, debugInfo, credentialsId }) => {
13011301
dispatch(
13021302
collectionAddOauth2CredentialsByUrl({
13031303
credentials,
13041304
url,
13051305
collectionUid,
1306+
credentialsId,
13061307
debugInfo,
13071308
folderUid: folderUid || null,
13081309
itemId: !folderUid ? itemId : null
@@ -1320,8 +1321,12 @@ export const clearOauth2Cache = (payload) => async (dispatch, getState) => {
13201321
window.ipcRenderer
13211322
.invoke('clear-oauth2-cache', collectionUid, url, credentialsId)
13221323
.then(() => {
1323-
// We do not dispatch any action to modify the Redux store,
1324-
// since we are only clearing the session on the main process side.
1324+
dispatch(
1325+
collectionClearOauth2CredentialsByUrl({
1326+
url,
1327+
collectionUid,
1328+
})
1329+
);
13251330
resolve();
13261331
})
13271332
.catch(reject);

packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,23 @@ export const collectionsSlice = createSlice({
324324
}
325325
}
326326
},
327+
clearTimeline: (state, action) => {
328+
const collection = findCollectionByUid(state.collections, action.payload.collectionUid);
329+
330+
if (collection) {
331+
collection.timeline = [];
332+
}
333+
},
334+
clearRequestTimeline: (state, action) => {
335+
const { collectionUid, itemUid } = action.payload || {};
336+
const collection = findCollectionByUid(state.collections, collectionUid);
337+
338+
if (collection) {
339+
if (itemUid) {
340+
collection.timeline = collection?.timeline?.filter(t => t?.itemUid !== itemUid);
341+
}
342+
}
343+
},
327344
saveRequest: (state, action) => {
328345
const collection = findCollectionByUid(state.collections, action.payload.collectionUid);
329346

@@ -2119,7 +2136,19 @@ export const collectionsSlice = createSlice({
21192136
},
21202137

21212138
collectionClearOauth2CredentialsByUrl: (state, action) => {
2122-
// Since we don't want to remove tokens from oauth2Credentials or timeline,
2139+
const { collectionUid, url, credentialsId } = action.payload;
2140+
const collection = findCollectionByUid(state.collections, collectionUid);
2141+
if (!collection) return;
2142+
2143+
if (collection.oauth2Credentials) {
2144+
let collectionOauth2Credentials = cloneDeep(collection.oauth2Credentials);
2145+
const filteredOauth2Credentials = filter(
2146+
collectionOauth2Credentials,
2147+
(creds) =>
2148+
!(creds.url === url && creds.collectionUid === collectionUid)
2149+
);
2150+
collection.oauth2Credentials = filteredOauth2Credentials;
2151+
}
21232152
},
21242153

21252154
collectionGetOauth2CredentialsByUrl: (state, action) => {
@@ -2167,6 +2196,8 @@ export const {
21672196
requestCancelled,
21682197
responseReceived,
21692198
responseCleared,
2199+
clearTimeline,
2200+
clearRequestTimeline,
21702201
saveRequest,
21712202
deleteRequestDraft,
21722203
newEphemeralHttpRequest,

packages/bruno-electron/src/utils/oauth2.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@ const getStoredOauth2Credentials = ({ collectionUid, url, credentialsId }) => {
2525
};
2626

2727
const isTokenExpired = (credentials) => {
28-
if (!credentials || !credentials.expires_in || !credentials.created_at) {
29-
return true; // Assume expired if missing data
28+
if (!credentials?.access_token) {
29+
return true;
30+
}
31+
if (!credentials?.expires_in || !credentials.created_at) {
32+
return false;
3033
}
3134
const expiryTime = credentials.created_at + credentials.expires_in * 1000;
3235
return Date.now() > expiryTime;

packages/bruno-lang/v2/src/bruToJson.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const ohm = require('ohm-js');
22
const _ = require('lodash');
3-
const { outdentString } = require('../../v1/src/utils');
3+
const { safeParseJson, outdentString } = require('./utils');
44

55
/**
66
* A Bru file is made up of blocks.
@@ -545,8 +545,8 @@ const sem = grammar.createSemantics().addAttribute('ast', {
545545
tokenPlacement: tokenPlacementKey?.value ? tokenPlacementKey.value : 'header',
546546
tokenHeaderPrefix: tokenHeaderPrefixKey?.value ? tokenHeaderPrefixKey.value : 'Bearer',
547547
tokenQueryKey: tokenQueryKeyKey?.value ? tokenQueryKeyKey.value : 'access_token',
548-
autoFetchToken: autoFetchTokenKey ? JSON.parse(autoFetchTokenKey?.value) : true,
549-
autoRefreshToken: autoRefreshTokenKey ? JSON.parse(autoRefreshTokenKey?.value) : true
548+
autoFetchToken: autoFetchTokenKey ? safeParseJson(autoFetchTokenKey?.value) ?? true : true,
549+
autoRefreshToken: autoRefreshTokenKey ? safeParseJson(autoRefreshTokenKey?.value) ?? true : true
550550
}
551551
: grantTypeKey?.value && grantTypeKey?.value == 'authorization_code'
552552
? {
@@ -559,14 +559,14 @@ const sem = grammar.createSemantics().addAttribute('ast', {
559559
clientSecret: clientSecretKey ? clientSecretKey.value : '',
560560
scope: scopeKey ? scopeKey.value : '',
561561
state: stateKey ? stateKey.value : '',
562-
pkce: pkceKey ? JSON.parse(pkceKey?.value || false) : false,
562+
pkce: pkceKey ? safeParseJson(pkceKey?.value) ?? false : false,
563563
credentialsPlacement: credentialsPlacementKey?.value ? credentialsPlacementKey.value : 'body',
564564
credentialsId: credentialsIdKey?.value ? credentialsIdKey.value : 'credentials',
565565
tokenPlacement: tokenPlacementKey?.value ? tokenPlacementKey.value : 'header',
566566
tokenHeaderPrefix: tokenHeaderPrefixKey?.value ? tokenHeaderPrefixKey.value : 'Bearer',
567567
tokenQueryKey: tokenQueryKeyKey?.value ? tokenQueryKeyKey.value : 'access_token',
568-
autoFetchToken: autoFetchTokenKey ? JSON.parse(autoFetchTokenKey?.value) : true,
569-
autoRefreshToken: autoRefreshTokenKey ? JSON.parse(autoRefreshTokenKey?.value) : true
568+
autoFetchToken: autoFetchTokenKey ? safeParseJson(autoFetchTokenKey?.value) ?? true : true,
569+
autoRefreshToken: autoRefreshTokenKey ? safeParseJson(autoRefreshTokenKey?.value) ?? true : true
570570
}
571571
: grantTypeKey?.value && grantTypeKey?.value == 'client_credentials'
572572
? {
@@ -581,8 +581,8 @@ const sem = grammar.createSemantics().addAttribute('ast', {
581581
tokenPlacement: tokenPlacementKey?.value ? tokenPlacementKey.value : 'header',
582582
tokenHeaderPrefix: tokenHeaderPrefixKey?.value ? tokenHeaderPrefixKey.value : 'Bearer',
583583
tokenQueryKey: tokenQueryKeyKey?.value ? tokenQueryKeyKey.value : 'access_token',
584-
autoFetchToken: autoFetchTokenKey ? JSON.parse(autoFetchTokenKey?.value) : true,
585-
autoRefreshToken: autoRefreshTokenKey ? JSON.parse(autoRefreshTokenKey?.value) : true
584+
autoFetchToken: autoFetchTokenKey ? safeParseJson(autoFetchTokenKey?.value) ?? true : true,
585+
autoRefreshToken: autoRefreshTokenKey ? safeParseJson(autoRefreshTokenKey?.value) ?? true : true
586586
}
587587
: {}
588588
}

packages/bruno-lang/v2/src/collectionBruToJson.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const ohm = require('ohm-js');
22
const _ = require('lodash');
3-
const { outdentString } = require('../../v1/src/utils');
3+
const { safeParseJson, outdentString } = require('./utils');
44

55
const grammar = ohm.grammar(`Bru {
66
BruFile = (meta | query | headers | auth | auths | vars | script | tests | docs)*
@@ -305,8 +305,8 @@ const sem = grammar.createSemantics().addAttribute('ast', {
305305
tokenPlacement: tokenPlacementKey?.value ? tokenPlacementKey.value : 'header',
306306
tokenHeaderPrefix: tokenHeaderPrefixKey?.value ? tokenHeaderPrefixKey.value : 'Bearer',
307307
tokenQueryKey: tokenQueryKeyKey?.value ? tokenQueryKeyKey.value : 'access_token',
308-
autoFetchToken: autoFetchTokenKey ? JSON.parse(autoFetchTokenKey?.value) : true,
309-
autoRefreshToken: autoRefreshTokenKey ? JSON.parse(autoRefreshTokenKey?.value) : true
308+
autoFetchToken: autoFetchTokenKey ? safeParseJson(autoFetchTokenKey?.value) ?? true : true,
309+
autoRefreshToken: autoRefreshTokenKey ? safeParseJson(autoRefreshTokenKey?.value) ?? true : true
310310
}
311311
: grantTypeKey?.value && grantTypeKey?.value == 'authorization_code'
312312
? {
@@ -319,14 +319,14 @@ const sem = grammar.createSemantics().addAttribute('ast', {
319319
clientSecret: clientSecretKey ? clientSecretKey.value : '',
320320
scope: scopeKey ? scopeKey.value : '',
321321
state: stateKey ? stateKey.value : '',
322-
pkce: pkceKey ? JSON.parse(pkceKey?.value || false) : false,
322+
pkce: pkceKey ? safeParseJson(pkceKey?.value) ?? false : false,
323323
credentialsPlacement: credentialsPlacementKey?.value ? credentialsPlacementKey.value : 'body',
324324
credentialsId: credentialsIdKey?.value ? credentialsIdKey.value : 'credentials',
325325
tokenPlacement: tokenPlacementKey?.value ? tokenPlacementKey.value : 'header',
326326
tokenHeaderPrefix: tokenHeaderPrefixKey?.value ? tokenHeaderPrefixKey.value : 'Bearer',
327327
tokenQueryKey: tokenQueryKeyKey?.value ? tokenQueryKeyKey.value : 'access_token',
328-
autoFetchToken: autoFetchTokenKey ? JSON.parse(autoFetchTokenKey?.value) : true,
329-
autoRefreshToken: autoRefreshTokenKey ? JSON.parse(autoRefreshTokenKey?.value) : true
328+
autoFetchToken: autoFetchTokenKey ? safeParseJson(autoFetchTokenKey?.value) ?? true : true,
329+
autoRefreshToken: autoRefreshTokenKey ? safeParseJson(autoRefreshTokenKey?.value) ?? true : true
330330
}
331331
: grantTypeKey?.value && grantTypeKey?.value == 'client_credentials'
332332
? {
@@ -341,8 +341,8 @@ const sem = grammar.createSemantics().addAttribute('ast', {
341341
tokenPlacement: tokenPlacementKey?.value ? tokenPlacementKey.value : 'header',
342342
tokenHeaderPrefix: tokenHeaderPrefixKey?.value ? tokenHeaderPrefixKey.value : 'Bearer',
343343
tokenQueryKey: tokenQueryKeyKey?.value ? tokenQueryKeyKey.value : 'access_token',
344-
autoFetchToken: autoFetchTokenKey ? JSON.parse(autoFetchTokenKey?.value) : true,
345-
autoRefreshToken: autoRefreshTokenKey ? JSON.parse(autoRefreshTokenKey?.value) : true
344+
autoFetchToken: autoFetchTokenKey ? safeParseJson(autoFetchTokenKey?.value) ?? true : true,
345+
autoRefreshToken: autoRefreshTokenKey ? safeParseJson(autoRefreshTokenKey?.value) ?? true : true
346346
}
347347
: {}
348348
}

packages/bruno-lang/v2/src/jsonToBru.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const _ = require('lodash');
22

3-
const { indentString } = require('../../v1/src/utils');
3+
const { indentString } = require('./utils');
44

55
const enabled = (items = [], key = "enabled") => items.filter((item) => item[key]);
66
const disabled = (items = [], key = "enabled") => items.filter((item) => !item[key]);
@@ -196,8 +196,8 @@ ${indentString(`token_placement: ${auth?.oauth2?.tokenPlacement || ''}`)}${
196196
}${
197197
auth?.oauth2?.tokenPlacement !== 'header' ? '\n' + indentString(`token_query_key: ${auth?.oauth2?.tokenQueryKey || ''}`) : ''
198198
}
199-
${indentString(`auto_fetch_token: ${(auth?.oauth2?.autoFetchToken|| false).toString()}`)}
200-
${indentString(`auto_refresh_token: ${(auth?.oauth2?.autoRefreshToken || false).toString()}`)}
199+
${indentString(`auto_fetch_token: ${(auth?.oauth2?.autoFetchToken ?? true).toString()}`)}
200+
${indentString(`auto_refresh_token: ${(auth?.oauth2?.autoRefreshToken ?? true).toString()}`)}
201201
}
202202
203203
`;
@@ -221,8 +221,8 @@ ${indentString(`token_placement: ${auth?.oauth2?.tokenPlacement || ''}`)}${
221221
}${
222222
auth?.oauth2?.tokenPlacement !== 'header' ? '\n' + indentString(`token_query_key: ${auth?.oauth2?.tokenQueryKey || ''}`) : ''
223223
}
224-
${indentString(`auto_fetch_token: ${(auth?.oauth2?.autoFetchToken|| false).toString()}`)}
225-
${indentString(`auto_refresh_token: ${(auth?.oauth2?.autoRefreshToken || false).toString()}`)}
224+
${indentString(`auto_fetch_token: ${(auth?.oauth2?.autoFetchToken ?? true).toString()}`)}
225+
${indentString(`auto_refresh_token: ${(auth?.oauth2?.autoRefreshToken ?? true).toString()}`)}
226226
}
227227
228228
`;
@@ -242,8 +242,8 @@ ${indentString(`token_placement: ${auth?.oauth2?.tokenPlacement || ''}`)}${
242242
}${
243243
auth?.oauth2?.tokenPlacement !== 'header' ? '\n' + indentString(`token_query_key: ${auth?.oauth2?.tokenQueryKey || ''}`) : ''
244244
}
245-
${indentString(`auto_fetch_token: ${(auth?.oauth2?.autoFetchToken|| false).toString()}`)}
246-
${indentString(`auto_refresh_token: ${(auth?.oauth2?.autoRefreshToken || false).toString()}`)}
245+
${indentString(`auto_fetch_token: ${(auth?.oauth2?.autoFetchToken ?? true).toString()}`)}
246+
${indentString(`auto_refresh_token: ${(auth?.oauth2?.autoRefreshToken ?? true).toString()}`)}
247247
}
248248
249249
`;

0 commit comments

Comments
 (0)