Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor: Edit, Goal, CharInventoryCreation #1008

Merged
merged 14 commits into from
Feb 15, 2021
Merged
Show file tree
Hide file tree
Changes from 13 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
15 changes: 14 additions & 1 deletion Backend.Tests/Models/UserEditTests.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using BackendFramework.Models;
using System.Collections.Generic;
using BackendFramework.Models;
using NUnit.Framework;

namespace Backend.Tests.Models
Expand Down Expand Up @@ -26,20 +27,32 @@ public void TestEqualsNull()
public class EditTests
{
private const int GoalType = 1;
private List<string> StepData = new List<string>() { "step" };
private const string Changes = "{wordIds:[]}";

[Test]
public void TestEquals()
{

var edit = new Edit { GoalType = GoalType };
Assert.That(edit.Equals(new Edit { GoalType = GoalType }));
edit.StepData = StepData;
Assert.That(edit.Equals(new Edit { GoalType = GoalType, StepData = StepData }));
edit.Changes = Changes;
Assert.That(edit.Equals(
new Edit { GoalType = GoalType, StepData = StepData, Changes = Changes }));

}

[Test]
public void TestEqualsNull()
{
var edit = new Edit { GoalType = GoalType };
Assert.IsFalse(edit.Equals(null));
edit = new Edit { StepData = StepData };
Assert.IsFalse(edit.Equals(null));
edit = new Edit { Changes = Changes };
Assert.IsFalse(edit.Equals(null));
}
}
}
2 changes: 2 additions & 0 deletions Backend/Controllers/UserEditController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public UserEditController(IUserEditRepository repo, IUserEditService userEditSer

/// <summary> Returns all <see cref="UserEdit"/>s for specified <see cref="Project"/> </summary>
/// <remarks> GET: v1/projects/{projectId}/useredits </remarks>
/// <returns> UserEdit list </returns>
[HttpGet]
public async Task<IActionResult> Get(string projectId)
{
Expand Down Expand Up @@ -80,6 +81,7 @@ public async Task<IActionResult> Delete(string projectId)

/// <summary> Returns <see cref="UserEdit"/>s with specified id </summary>
/// <remarks> GET: v1/projects/{projectId}/useredits/{userEditId} </remarks>
/// <returns> UserEdit </returns>
[HttpGet("{userEditId}")]
public async Task<IActionResult> Get(string projectId, string userEditId)
{
Expand Down
12 changes: 9 additions & 3 deletions Backend/Models/UserEdit.cs
Original file line number Diff line number Diff line change
Expand Up @@ -113,18 +113,23 @@ public class Edit
[BsonElement("stepData")]
public List<string> StepData { get; set; }

[BsonElement("changes")]
public string Changes { get; set; }

public Edit()
{
GoalType = 0;
StepData = new List<string>();
Changes = "{}";
}

public Edit Clone()
{
var clone = new Edit
{
GoalType = GoalType,
StepData = new List<string>()
StepData = new List<string>(),
Changes = (string)Changes.Clone()
};

foreach (var stepData in StepData)
Expand All @@ -145,12 +150,13 @@ public override bool Equals(object? obj)
return
GoalType.Equals(other.GoalType) &&
other.StepData.Count == StepData.Count &&
other.StepData.All(StepData.Contains);
other.StepData.All(StepData.Contains) &&
other.Changes.Equals(Changes);
}

public override int GetHashCode()
{
return HashCode.Combine(GoalType, StepData);
return HashCode.Combine(GoalType, StepData, Changes);
}
}

Expand Down
71 changes: 21 additions & 50 deletions src/backend/index.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
import axios from "axios";

import authHeader from "components/Login/AuthHeaders";
import * as LocalStorage from "backend/localStorage";
import history, { Path } from "browserHistory";
import authHeader from "components/Login/AuthHeaders";
import { Goal, GoalStep } from "types/goals";
import { convertGoalToEdit } from "types/goalUtilities";
import { Project } from "types/project";
import { RuntimeConfig } from "types/runtimeConfig";
import SemanticDomainWithSubdomains from "types/SemanticDomain";
import { User } from "types/user";
import { UserEdit } from "types/userEdit";
import { UserRole } from "types/userRole";
import { MergeWord, Word } from "types/word";
import * as LocalStorage from "backend/localStorage";

export const baseURL = `${RuntimeConfig.getInstance().baseUrl()}`;
const apiBaseURL = `${baseURL}/v1`;
Expand Down Expand Up @@ -72,19 +73,15 @@ export async function createWord(word: Word): Promise<Word> {
export async function getWord(id: string): Promise<Word> {
let resp = await backendServer.get(
`projects/${LocalStorage.getProjectId()}/words/${id}`,
{
headers: authHeader(),
}
{ headers: authHeader() }
);
return resp.data;
}

export async function getAllWords(): Promise<Word[]> {
let resp = await backendServer.get(
`projects/${LocalStorage.getProjectId()}/words`,
{
headers: authHeader(),
}
{ headers: authHeader() }
);
return resp.data;
}
Expand Down Expand Up @@ -192,9 +189,7 @@ export async function getAllUsers(): Promise<User[]> {
export async function getAllUsersInCurrentProject(): Promise<User[]> {
let resp = await backendServer.get(
`projects/${LocalStorage.getProjectId()}/users`,
{
headers: authHeader(),
}
{ headers: authHeader() }
);
return resp.data;
}
Expand Down Expand Up @@ -400,27 +395,17 @@ export async function avatarSrc(userId: string): Promise<string> {
return `data:${resp.headers["content-type"].toLowerCase()};base64,${image}`;
}

function convertGoalToBackendEdit(goal: Goal) {
const stepData = goal.steps.map((s) => JSON.stringify(s));
return {
goalType: goal.goalType.toString(),
stepData,
};
}

/** Returns index of added goal */
export async function addGoalToUserEdit(
userEditId: string,
goal: Goal
): Promise<number> {
const userEditTuple = convertGoalToBackendEdit(goal);
const edit = convertGoalToEdit(goal);
const projectId = LocalStorage.getProjectId();
const resp = await backendServer.post(
`projects/${projectId}/useredits/${userEditId}`,
userEditTuple,
{
headers: authHeader(),
}
edit,
{ headers: authHeader() }
);
return resp.data;
}
Expand All @@ -438,22 +423,19 @@ export async function addStepToGoal(
.put(
`projects/${LocalStorage.getProjectId()}/useredits/${userEditId}`,
stepEditTuple,
{
headers: { ...authHeader() },
}
{ headers: authHeader() }
)
.then((resp) => {
return resp.data;
});
}

export async function createUserEdit(): Promise<Object> {
/** Returns User with updated .workedProjects */
export async function createUserEdit(): Promise<User> {
let resp = await backendServer.post(
`projects/${LocalStorage.getProjectId()}/useredits`,
"",
{
headers: authHeader(),
}
{ headers: authHeader() }
);
return resp.data;
}
Expand All @@ -468,12 +450,11 @@ export async function getUserEditById(
return resp.data;
}

export async function getAllUserEdits(): Promise<Goal[]> {
/** Returns array with every UserEdit for the current project */
export async function getAllUserEdits(): Promise<UserEdit[]> {
let resp = await backendServer.get(
`projects/${LocalStorage.getProjectId()}/useredits`,
{
headers: authHeader(),
}
{ headers: authHeader() }
);
return resp.data;
}
Expand All @@ -491,19 +472,15 @@ export async function getSemanticDomains(): Promise<
export async function getUserRoles(): Promise<UserRole[]> {
let resp = await backendServer.get(
`projects/${LocalStorage.getProjectId()}/userroles`,
{
headers: authHeader(),
}
{ headers: authHeader() }
);
return resp.data;
}

export async function canUploadLift(): Promise<boolean> {
let resp = await backendServer.get(
`projects/${LocalStorage.getProjectId()}/liftcheck`,
{
headers: authHeader(),
}
{ headers: authHeader() }
);
return resp.data;
}
Expand All @@ -515,9 +492,7 @@ export async function addUserRole(
await backendServer.put(
`projects/${LocalStorage.getProjectId()}/users/${user.id}`,
permissions,
{
headers: authHeader(),
}
{ headers: authHeader() }
);
}

Expand All @@ -534,9 +509,7 @@ export async function emailInviteToProject(
ProjectId: projectId,
Domain: window.location.origin,
},
{
headers: authHeader(),
}
{ headers: authHeader() }
);
return resp.data;
}
Expand All @@ -548,9 +521,7 @@ export async function validateLink(
let resp = await backendServer.put(
`projects/invite/${projectId}/validate/${token}`,
"",
{
headers: authHeader(),
}
{ headers: authHeader() }
);
return resp.data;
}
11 changes: 1 addition & 10 deletions src/components/GoalTimeline/GoalsActions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ import history, { Path } from "browserHistory";
import { StoreState } from "types";
import { ActionWithPayload, StoreStateDispatch } from "types/actions";
import { Goal, GoalType } from "types/goals";
import { goalTypeToGoal } from "types/goalUtilities";
import { Edit } from "types/userEdit";
import { convertEditToGoal } from "types/goalUtilities";

export enum GoalsActions {
LOAD_USER_EDITS = "LOAD_USER_EDITS",
Expand Down Expand Up @@ -185,14 +184,6 @@ export function getUserEditId(): string | undefined {
}
}

export function convertEditToGoal(edit: Edit): Goal {
const goal = goalTypeToGoal(edit.goalType);
goal.steps = edit.stepData.map((stepString) => JSON.parse(stepString));
goal.numSteps = goal.steps.length;
goal.completed = true;
return goal;
}

async function saveCurrentStep(goal: Goal, goalIndex: number) {
const userEditId = getUserEditId();
if (userEditId) {
Expand Down
27 changes: 2 additions & 25 deletions src/components/GoalTimeline/tests/GoalTimelineActions.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { goalDataMock } from "goals/MergeDupGoal/MergeDupStep/tests/MockMergeDup
import { Goal } from "types/goals";
import { maxNumSteps } from "types/goalUtilities";
import { User } from "types/user";
import { Edit, UserEdit } from "types/userEdit";
import { UserEdit } from "types/userEdit";

jest.mock("goals/MergeDupGoal/MergeDupStep/MergeDupStepActions", () => {
const realMergeDupActions = jest.requireActual(
Expand Down Expand Up @@ -58,7 +58,7 @@ const mockUpdateUser = jest.fn();
function setMockFunctions() {
mockAddGoalToUserEdit.mockResolvedValue(0);
mockAddStepToGoal.mockResolvedValue(0);
mockCreateUserEdit.mockResolvedValue({});
mockCreateUserEdit.mockResolvedValue(mockUser);
mockDispatchMergeStepData.mockReturnValue(mockAction);
mockGetUser.mockResolvedValue(mockUser);
mockGetUserEditById.mockResolvedValue(mockUserEdit);
Expand Down Expand Up @@ -354,27 +354,4 @@ describe("GoalsActions", () => {
expect(actions.getUserEditId()).toEqual(undefined);
});
});

describe("convertEditToGoal", () => {
it("should build a completed goal with the same goalType and steps", () => {
const oldGoal: Goal = new MergeDups();
oldGoal.numSteps = maxNumSteps(oldGoal.goalType);
oldGoal.steps = [
{
words: [...goalDataMock.plannedWords[0]],
},
{
words: [...goalDataMock.plannedWords[1]],
},
];
const edit: Edit = {
goalType: oldGoal.goalType,
stepData: oldGoal.steps.map((s) => JSON.stringify(s)),
};
const newGoal = actions.convertEditToGoal(edit);
expect(newGoal.goalType).toEqual(oldGoal.goalType);
expect(newGoal.steps).toEqual(oldGoal.steps);
expect(newGoal.numSteps).toEqual(oldGoal.steps.length);
});
});
});
Loading