Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,5 @@ EXPOSE 3000
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/postgraphile.tags.json5 ./postgraphile.tags.json5
RUN npx next telemetry disable

CMD ["node_modules/.bin/next", "start"]
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,15 @@ Contributions for the following are very welcome.
- [x] Number: Usage Total Count
- [x] Graph: Usage of last 31 days
- [ ] Link Ownership
- [ ] Link Parameters
- [x] Link Parameters
- For example, a `gh` alias with url `https://github.com/$1/$2` allows `https://go/gh/armand1m/golinks` to be possible.
- [ ] Link Groups (Folders)
- [x] URL: Accept `/` and can be redirected
- [ ] UI: Folds URL groups
- [ ] Private Links
- [ ] Temporary Links
- [ ] Random Alias
- [ ] Help section
- [ ] Chrome Plugin

## Usage
Expand Down
74 changes: 74 additions & 0 deletions lib/features/link-parameters/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import { ApolloClient, NormalizedCacheObject } from '@apollo/client';
import {
GetLinkByAliasDocument,
GetLinkByAliasQuery,
GetLinkByAliasQueryVariables,
} from '../../queries/getLinkByAlias.graphql';

interface CreateRedirectUrlProps {
linkUrl: string;
linkAlias: string;
contextAlias: string[];
}

export const createRedirectUrl = ({
linkUrl,
linkAlias,
contextAlias,
}: CreateRedirectUrlProps) => {
const urlParameters = linkUrl.match(/\$(\d+)/g);

if (urlParameters?.length) {
const parameters = contextAlias.filter(
(param) => param !== linkAlias && !linkAlias.includes(param)
);

const finalUrl = urlParameters.reduce((acc, urlParam, index) => {
return acc.replace(urlParam, parameters[index]);
}, linkUrl);

return finalUrl;
}

return linkUrl;
};

interface FindLinkRecursiveProps {
contextAlias: string[];
apolloClient: ApolloClient<NormalizedCacheObject>;
}

export const findLinkRecursive = async ({
contextAlias,
apolloClient,
}: FindLinkRecursiveProps): Promise<
GetLinkByAliasQuery['linkByAlias']
> => {
if (contextAlias.length === 0) {
return undefined;
}

const alias = contextAlias.join('/');

const queryResult = await apolloClient.query<
GetLinkByAliasQuery,
GetLinkByAliasQueryVariables
>({
query: GetLinkByAliasDocument,
variables: {
alias,
},
});

const link = queryResult.data.linkByAlias;

if (!link) {
const $contextAlias = contextAlias.slice(0, -1);
return findLinkRecursive({
contextAlias: $contextAlias,
apolloClient,
});
}

return link;
};
36 changes: 16 additions & 20 deletions pages/[...alias].tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,6 @@ import {

import { NotFoundAnimation } from '../components/NotFoundAnimation';
import { TopNavigation } from '../components/TopNavigation';
import {
GetLinkByAliasDocument,
GetLinkByAliasQuery,
GetLinkByAliasQueryVariables,
} from '../lib/queries/getLinkByAlias.graphql';
import {
CreateLinkUsageMetricDocument,
CreateLinkUsageMetricMutation,
Expand All @@ -27,6 +22,10 @@ import {
SearchLinksQuery,
SearchLinksQueryVariables,
} from '../lib/queries/searchLinks.graphql';
import {
createRedirectUrl,
findLinkRecursive,
} from '../lib/features/link-parameters';

interface Props {
alias: string;
Expand Down Expand Up @@ -133,8 +132,6 @@ export const getServerSideProps: GetServerSideProps<Props> = async (
context?.req as NextApiRequest
);
const apolloClient = initializeApollo();

const alias = (context.query.alias as string[]).join('/');
const logoname = Config.metadata.logoname;
const baseUrl = Config.metadata.baseUrl;
const isAuthEnabled = Config.features.auth0;
Expand All @@ -148,19 +145,14 @@ export const getServerSideProps: GetServerSideProps<Props> = async (
)
: false;

const queryResult = await apolloClient.query<
GetLinkByAliasQuery,
GetLinkByAliasQueryVariables
>({
query: GetLinkByAliasDocument,
variables: {
alias,
},
const contextAlias = context.query.alias as string[];
const link = await findLinkRecursive({
contextAlias,
apolloClient,
});

const link = queryResult.data.linkByAlias;

if (!link) {
const alias = contextAlias.join('/');
const searchResults = await apolloClient.query<
SearchLinksQuery,
SearchLinksQueryVariables
Expand All @@ -187,7 +179,7 @@ export const getServerSideProps: GetServerSideProps<Props> = async (
}

/**
* Trigger metric update and forget about it.
* Trigger metric update in the background.
*/
apolloClient
.mutate<
Expand All @@ -214,7 +206,11 @@ export const getServerSideProps: GetServerSideProps<Props> = async (
const response = context.res;

response.writeHead(302, {
Location: link.url,
Location: createRedirectUrl({
linkUrl: link.url,
linkAlias: link.alias,
contextAlias,
}),
});

response.end();
Expand All @@ -225,7 +221,7 @@ export const getServerSideProps: GetServerSideProps<Props> = async (
**/
return {
props: {
alias,
alias: link.alias,
baseUrl,
logoname,
isMobile,
Expand Down