get tags information

This commit is contained in:
CodeServer 2022-04-09 12:41:13 +01:00
parent 07d16b9aef
commit 0714b3e561
4 changed files with 96 additions and 8 deletions

View File

@ -3,6 +3,7 @@ import { useState, useEffect } from "react";
import { List, ListItemButton, Box, Typography } from "@mui/material"; import { List, ListItemButton, Box, Typography } from "@mui/material";
import axios from "../../api/axios"; import axios from "../../api/axios";
import useAuth from "../../hooks/useAuth"; import useAuth from "../../hooks/useAuth";
import Tag from "../../interfaces/Tag";
import Repository from "../../interfaces/Repositoriy"; import Repository from "../../interfaces/Repositoriy";
const Home: React.FC = () => { const Home: React.FC = () => {
@ -10,6 +11,77 @@ const Home: React.FC = () => {
const [repositories, setRepositories] = useState<Repository[]>([]); const [repositories, setRepositories] = useState<Repository[]>([]);
const getTagInfo = async(newRepositories: Repository[]) => {
let promises: Promise<void>[] = [];
newRepositories.forEach((repository: Repository) => {
repository.tags.forEach((tag: Tag) => {
let promise = axios.get(
"/" + repository.name + "/manifests/" + tag.label,
{
headers:{
Accept: "application/vnd.docker.distribution.manifest.v2+json",
},
auth: {
username: auth.username,
password: auth.password
}
}
).then((response) => {
tag.digest = response?.headers['docker-content-digest'];
return axios.get(
"/" + repository.name + "/blobs/" + response?.data?.config['digest'],
{
headers:{
Accept: "application/vnd.docker.distribution.manifest.v2+json",
},
auth: {
username: auth.username,
password: auth.password
}
}
).then((res) => {
tag.architecture = res?.data?.architecture;
tag.os = res?.data?.os;
tag.created = new Date(res?.data?.created);
});
});
promises.push(promise);
});
});
return Promise.all(promises);
};
const getTags = async(newRepositories: Repository[]) => {
let promises: Promise<void>[] = [];
newRepositories.forEach((repository: Repository) => {
let promise = axios.get(
"/" + repository.name + "/tags/list",
{
auth: {
username: auth.username,
password: auth.password
}
}
).then((res) => {
let tags: Tag[] = [];
res?.data?.tags.forEach((tagLabel: string) => {
let tag: Tag = {
label: tagLabel,
architecture: "",
os: "",
created: undefined,
digest: ""
}
tags.push(tag);
});
repository.tags = tags;
});
promises.push(promise);
});
await Promise.all(promises);
return getTagInfo(newRepositories);
};
const listRepositories = async() => { const listRepositories = async() => {
const response = await axios.get( const response = await axios.get(
@ -30,6 +102,7 @@ const Home: React.FC = () => {
} }
newRepositories.push(newRepository); newRepositories.push(newRepository);
}); });
await getTags(newRepositories)
setRepositories(newRepositories); setRepositories(newRepositories);
}; };
@ -40,15 +113,14 @@ const Home: React.FC = () => {
return( return(
<List style={{ maxHeight: "100%", overflow: "auto" }}> <List style={{ maxHeight: "100%", overflow: "auto" }}>
{repositories.map((repositoriy: Repository) => { {repositories.map((repository: Repository) => {
return( return(
<ListItemButton <ListItemButton
component="a" component="a"
> >
<Box sx={{ display: "flex", flexDirection: "column" }}> <Box sx={{ display: "flex", flexDirection: "column" }}>
<Typography color="black" variant="h5">{repositoriy.name}</Typography> <Typography color="black" variant="h5">{repository.name}</Typography>
<Typography color="white" variant="h6"></Typography> <Typography color="grey" variant="h6">{repository.tags.map((tag: Tag) => (tag.created ? tag.created.toDateString() : "Time created not available")).join(" ")}</Typography>
<Typography color="mistyrose" variant="body1"></Typography>
</Box> </Box>
</ListItemButton> </ListItemButton>
); );

View File

@ -1,7 +1,4 @@
interface Tag { import Tag from "./Tag";
label: string;
architecture: string;
}
interface Repository { interface Repository {
name: string; name: string;

9
src/interfaces/Tag.tsx Normal file
View File

@ -0,0 +1,9 @@
interface Tag {
label: string;
architecture: string;
os: string;
created: Date | undefined;
digest: string;
}
export default Tag;

10
src/interfaces/Utils.tsx Normal file
View File

@ -0,0 +1,10 @@
const digestDisplay = (digest: string): string => {
let digestInfo = digest.split(':');
if (digestInfo.length >= 2) {
return digestInfo[1].slice(0,12);
}
return digest;
};
export { digestDisplay };