Files
SCM-Manager/scm-ui/src/repos/modules/changesets.js

259 lines
6.3 KiB
JavaScript
Raw Normal View History

2018-09-10 17:00:53 +02:00
// @flow
import {FAILURE_SUFFIX, PENDING_SUFFIX, SUCCESS_SUFFIX} from "../../modules/types";
import {apiClient} from "@scm-manager/ui-components";
import {isPending} from "../../modules/pending";
import {getFailure} from "../../modules/failure";
import {combineReducers} from "redux";
import type {Action, Changeset, PagedCollection, Repository} from "@scm-manager/ui-types";
2018-09-10 17:00:53 +02:00
export const FETCH_CHANGESETS = "scm/repos/FETCH_CHANGESETS";
export const FETCH_CHANGESETS_PENDING = `${FETCH_CHANGESETS}_${PENDING_SUFFIX}`;
export const FETCH_CHANGESETS_SUCCESS = `${FETCH_CHANGESETS}_${SUCCESS_SUFFIX}`;
export const FETCH_CHANGESETS_FAILURE = `${FETCH_CHANGESETS}_${FAILURE_SUFFIX}`;
const REPO_URL = "repositories";
2018-09-19 13:49:04 +02:00
//TODO: Content type
// actions
2018-09-10 17:00:53 +02:00
2018-09-19 17:18:24 +02:00
export function fetchChangesetsByLink(
2018-10-04 17:12:38 +02:00
repository: Repository,
2018-09-19 17:18:24 +02:00
link: string,
branch?: Branch
2018-09-19 17:18:24 +02:00
) {
return function(dispatch: any) {
2018-10-04 17:12:38 +02:00
dispatch(fetchChangesetsPending(repository, branch));
2018-09-19 17:18:24 +02:00
return apiClient
.get(link)
.then(response => response.json())
.then(data => {
2018-10-04 17:12:38 +02:00
dispatch(fetchChangesetsSuccess(data, repository, branch));
2018-09-19 17:18:24 +02:00
})
.catch(cause => {
2018-10-04 17:12:38 +02:00
dispatch(fetchChangesetsFailure(repository, cause, branch));
2018-09-19 17:18:24 +02:00
});
};
}
2018-09-19 13:49:04 +02:00
export function fetchChangesetsWithOptions(
2018-10-04 17:12:38 +02:00
repository: Repository,
branch?: Branch,
2018-09-19 13:49:04 +02:00
suffix?: string
) {
2018-10-04 17:12:38 +02:00
let link = repository._links.changesets.href;
if (branch) {
link = branch._links.history.href;
2018-09-19 13:49:04 +02:00
}
2018-10-04 17:12:38 +02:00
2018-09-19 13:49:04 +02:00
if (suffix) {
link = link + `${suffix}`;
}
2018-09-19 13:49:04 +02:00
return function(dispatch: any) {
2018-10-04 17:12:38 +02:00
dispatch(fetchChangesetsPending(repository, branch));
2018-09-19 13:49:04 +02:00
return apiClient
.get(link)
.then(response => response.json())
.then(data => {
2018-10-04 17:12:38 +02:00
dispatch(fetchChangesetsSuccess(data, repository, branch));
})
2018-09-19 13:49:04 +02:00
.catch(cause => {
2018-10-04 17:12:38 +02:00
dispatch(fetchChangesetsFailure(repository, cause, branch));
2018-09-19 13:49:04 +02:00
});
};
}
2018-10-04 17:12:38 +02:00
export function fetchChangesets(repository: Repository) {
return fetchChangesetsWithOptions(repository);
2018-09-19 13:49:04 +02:00
}
2018-10-04 17:12:38 +02:00
export function fetchChangesetsByPage(repository: Repository, page: number) {
return fetchChangesetsWithOptions(repository, "", `?page=${page - 1}`);
2018-09-19 13:49:04 +02:00
}
2018-10-04 17:12:38 +02:00
// TODO: Rewrite code to fetch changesets by branches, adjust tests and let BranchChooser fetch branches
2018-09-19 13:49:04 +02:00
export function fetchChangesetsByBranchAndPage(
2018-10-04 17:12:38 +02:00
repository: Repository,
branch: Branch,
2018-09-19 13:49:04 +02:00
page: number
) {
2018-10-04 17:12:38 +02:00
return fetchChangesetsWithOptions(repository, branch, `?page=${page - 1}`);
}
2018-10-04 17:12:38 +02:00
export function fetchChangesetsByBranch(
repository: Repository,
branch: Branch
2018-09-19 13:49:04 +02:00
) {
2018-10-04 17:12:38 +02:00
return fetchChangesetsWithOptions(repository, branch);
2018-09-19 13:49:04 +02:00
}
export function fetchChangesetsPending(
2018-10-04 17:12:38 +02:00
repository: Repository,
branch?: Branch
2018-09-19 13:49:04 +02:00
): Action {
2018-10-04 17:12:38 +02:00
const itemId = createItemId(repository, branch);
if (!branch) {
branch = "";
}
2018-09-10 17:00:53 +02:00
return {
type: FETCH_CHANGESETS_PENDING,
2018-10-04 17:12:38 +02:00
payload: { repository, branch },
2018-09-18 16:30:37 +02:00
itemId
2018-09-19 13:49:04 +02:00
};
2018-09-10 17:00:53 +02:00
}
2018-09-19 13:49:04 +02:00
export function fetchChangesetsSuccess(
changesets: any,
2018-10-04 17:12:38 +02:00
repository: Repository,
branch?: Branch
2018-09-19 13:49:04 +02:00
): Action {
2018-09-10 17:00:53 +02:00
return {
type: FETCH_CHANGESETS_SUCCESS,
2018-09-18 16:30:37 +02:00
payload: changesets,
2018-10-04 17:12:38 +02:00
itemId: createItemId(repository, branch)
2018-09-19 13:49:04 +02:00
};
2018-09-10 17:00:53 +02:00
}
2018-09-19 13:49:04 +02:00
function fetchChangesetsFailure(
2018-10-04 17:12:38 +02:00
repository: Repository,
2018-09-19 13:49:04 +02:00
error: Error,
branch?: Branch
2018-09-19 13:49:04 +02:00
): Action {
2018-09-10 17:00:53 +02:00
return {
type: FETCH_CHANGESETS_FAILURE,
payload: {
2018-10-04 17:12:38 +02:00
repository,
error,
branch
},
2018-10-04 17:12:38 +02:00
itemId: createItemId(repository, branch)
2018-09-19 13:49:04 +02:00
};
2018-09-10 17:00:53 +02:00
}
function createItemId(repository: Repository, branch?: Branch): string {
2018-10-04 17:12:38 +02:00
const { namespace, name } = repository;
let itemId = namespace + "/" + name;
if (branch && branch !== "") {
itemId = itemId + "/" + branch.name;
}
return itemId;
}
// reducer
2018-09-19 13:49:04 +02:00
function byKeyReducer(
state: any = {},
action: Action = { type: "UNKNOWN" }
): Object {
2018-09-10 17:00:53 +02:00
switch (action.type) {
case FETCH_CHANGESETS_SUCCESS:
2018-09-19 17:18:24 +02:00
const changesets = action.payload._embedded.changesets;
const changesetIds = changesets.map(c => c.id);
2018-09-19 13:49:04 +02:00
const key = action.itemId;
let oldChangesets = { [key]: {} };
if (state[key] !== undefined) {
2018-09-19 13:49:04 +02:00
oldChangesets[key] = state[key];
}
2018-09-19 17:18:24 +02:00
const byIds = extractChangesetsByIds(changesets, oldChangesets[key].byId);
2018-09-19 13:49:04 +02:00
return {
...state,
2018-09-19 13:49:04 +02:00
[key]: {
2018-09-19 17:18:24 +02:00
byId: { ...byIds },
list: {
entries: changesetIds,
entry: {
page: action.payload.page,
pageTotal: action.payload.pageTotal,
_links: action.payload._links
}
}
2018-09-19 13:49:04 +02:00
}
};
2018-09-10 17:00:53 +02:00
default:
return state;
}
}
2018-09-19 13:49:04 +02:00
export default combineReducers({
byKey: byKeyReducer
});
2018-09-19 17:18:24 +02:00
function extractChangesetsByIds(changesets: any, oldChangesetsByIds: any) {
2018-09-10 17:00:53 +02:00
const changesetsByIds = {};
2018-09-10 17:00:53 +02:00
for (let changeset of changesets) {
changesetsByIds[changeset.id] = changeset;
}
for (let id in oldChangesetsByIds) {
changesetsByIds[id] = oldChangesetsByIds[id];
}
2018-09-10 17:00:53 +02:00
return changesetsByIds;
}
//selectors
2018-10-05 09:55:17 +02:00
export function getChangesets(
state: Object,
repository: Repository,
branch?: string
) {
2018-10-04 17:12:38 +02:00
const key = createItemId(repository, branch);
2018-09-19 13:49:04 +02:00
if (!state.changesets.byKey[key]) {
return null;
}
2018-09-19 13:49:04 +02:00
return Object.values(state.changesets.byKey[key].byId);
}
2018-09-19 13:49:04 +02:00
export function isFetchChangesetsPending(
state: Object,
2018-10-04 17:12:38 +02:00
repository: Repository,
2018-09-19 13:49:04 +02:00
branch?: string
) {
2018-10-04 17:12:38 +02:00
return isPending(state, FETCH_CHANGESETS, createItemId(repository, branch));
}
2018-09-19 13:49:04 +02:00
export function getFetchChangesetsFailure(
state: Object,
2018-10-04 17:12:38 +02:00
repository: Repository,
2018-09-19 13:49:04 +02:00
branch?: string
) {
2018-10-04 17:12:38 +02:00
return getFailure(state, FETCH_CHANGESETS, createItemId(repository, branch));
}
2018-09-19 17:18:24 +02:00
const selectList = (state: Object, key: string) => {
if (state.changesets.byKey[key] && state.changesets.byKey[key].list) {
return state.changesets.byKey[key].list;
2018-09-19 13:49:04 +02:00
}
return {};
};
2018-09-19 17:18:24 +02:00
const selectListEntry = (state: Object, key: string): Object => {
const list = selectList(state, key);
2018-09-19 13:49:04 +02:00
if (list.entry) {
return list.entry;
}
return {};
};
2018-09-19 17:18:24 +02:00
export const selectListAsCollection = (
state: Object,
key: string
): PagedCollection => {
return selectListEntry(state, key);
2018-09-19 13:49:04 +02:00
};
2018-09-19 17:18:24 +02:00
export function getChangesetsFromState(state: Object, key: string) {
const changesetIds = selectList(state, key).entries;
if (!changesetIds) {
return null;
}
const changesetEntries: Changeset[] = [];
for (let id of changesetIds) {
changesetEntries.push(state.changesets.byKey[key].byId[id]);
}
return changesetEntries;
}