Skip to content

Commit edeabd9

Browse files
authored
Merge pull request #23 from oslabs-beta/liamvictor/clonefix
Liamvictor/clonefix
2 parents d18313c + cd2f67c commit edeabd9

File tree

8 files changed

+58
-61
lines changed

8 files changed

+58
-61
lines changed

app/src/components/main/CanvasContainer.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ function CanvasContainer(props): JSX.Element {
1919
// onClickCodePreview swaps the rendered component from the canvas to the code preview editor
2020
const onClickCodePreview = () => {
2121
dispatch(toggleCodePreview());
22-
console.log(state.codePreview);
2322
}
2423

2524
const canvasContainerStyle = {

app/src/components/main/DemoRender.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ const DemoRender = (): JSX.Element => {
8282
const elementType = element.name;
8383
const childId = element.childId;
8484
const elementStyle = element.style;
85-
const innerText = element.attributes.compText;
85+
const innerText = element.attributes.compText;
8686
const classRender = element.attributes.cssClasses;
8787
const activeLink = element.attributes.compLink;
8888
let renderedChildren;

app/src/components/marketplace/MarketplaceCard.tsx

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@ import React from 'react';
1818
import imageSrc from '../../../../resources/marketplace_images/marketplace_image.png';
1919
import { red } from '@mui/material/colors';
2020
import axios from 'axios';
21-
import {useDispatch, useSelector} from 'react-redux'
21+
import { useDispatch, useSelector } from 'react-redux'
2222
import { RootState } from '../../redux/store';
23+
import { saveProject } from '../../helperFunctions/projectGetSaveDel';
24+
import { useHistory } from 'react-router-dom';
25+
import { openProject } from '../../redux/reducers/slice/appStateSlice';
2326

2427
interface Project {
2528
forked: String,
@@ -36,21 +39,27 @@ interface Project {
3639

3740
const ITEM_HEIGHT = 48;
3841
const MarketplaceCard = ({proj} :{proj: Project}) => {
42+
const dispatch = useDispatch();
43+
const history = useHistory();
3944
const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);
4045
const open = Boolean(anchorEl);
4146
const state = useSelector((store:RootState) => store.appState);
4247
const handleClick = (event: React.MouseEvent<HTMLElement>) => {
4348
setAnchorEl(event.currentTarget);
4449
};
4550
const handleClone = async () => { // creates a copy of the project
46-
const updatedProject: Project = JSON.parse(JSON.stringify(proj)); // creates a deep copy
47-
updatedProject.forked = `Forked from ${updatedProject.username}`;
48-
const username = window.localStorage.getItem('username');
49-
await axios.post('/cloneProject', {
50-
updatedProject, username: username //passing in the username from localstorage for verification, just in case someone altered local storage
51-
});
51+
const docId = proj._id;
52+
const response = await axios.get(`/cloneProject/${docId}`);
53+
const project = response.data.project;
5254
alert('Project cloned!');
5355
setAnchorEl(null);
56+
return project;
57+
};
58+
59+
const handleCloneOpen = async() => {
60+
const project = await handleClone();
61+
history.push('/');
62+
dispatch(openProject(project));
5463
};
5564
const handleClose = () => {
5665
setAnchorEl(null);
@@ -109,11 +118,19 @@ const MarketplaceCard = ({proj} :{proj: Project}) => {
109118
<MenuItem
110119
onClick={handleClone}
111120
sx={{
112-
color: '#C6C6C6'
121+
color: '#fff'
113122
}}
114123
>
115124
Clone
116125
</MenuItem>
126+
<MenuItem
127+
onClick={handleCloneOpen}
128+
sx={{
129+
color: '#fff'
130+
}}
131+
>
132+
Clone and open
133+
</MenuItem>
117134
</Menu>
118135
</Card>
119136
</>

app/src/containers/MarketplaceContainer.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ const MarketplaceContainer = () => {
1717
},
1818
withCredentials: true,
1919
});
20-
2120
setMarketplaceProjects(response.data);
2221
setDisplayProjects(response.data);
2322

app/src/public/styles/style.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -840,5 +840,5 @@ a.nav_link:hover {
840840
}
841841

842842
li {
843-
color: black !important;
843+
color: black;
844844
}

server/controllers/marketplaceController.ts

Lines changed: 29 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import Project from '../graphQL/resolvers/query';
12
import { MarketplaceController } from '../interfaces';
23
import { Projects, Users } from '../models/reactypeModels';
34

@@ -19,8 +20,12 @@ const marketplaceController: MarketplaceController = {
1920
}
2021
});
2122
}
22-
// returns the entire project document, including the id
23-
res.locals.publishedProjects = projects;
23+
// returns the entire project document as an array
24+
// need to convert each project document to an object
25+
const convertedProjects = projects.map((project) => {
26+
return project.toObject({ minimize: false });
27+
});
28+
res.locals.publishedProjects = convertedProjects;
2429
return next();
2530
});
2631
},
@@ -108,53 +113,32 @@ const marketplaceController: MarketplaceController = {
108113
* Middleware function that clones and saves project to user's library
109114
*
110115
*/
111-
cloneProject: (req, res, next) => {
112-
const { updatedProject, username } = req.body;
113-
console.log('username in cloneProject end', username);
116+
cloneProject: async (req, res, next) => {
114117
// pulls cookies from request
115-
const currentuserID = req.cookies.ssid
116-
//getting the username based on the cookies ssid
117-
Users.findOne({ _id: currentuserID }, (err, user) => {
118-
if (err) {
119-
return next({
120-
log: `Error in marketplaceController.cloneProjects findUser: ${err}`,
121-
message: {
122-
err: 'Error in marketplaceController.cloneProjects findUser, check server logs for details'
123-
}
124-
});
125-
}else if (user.username !== username){ //prevents users from editing their username to assign a different username to a cloned project
126-
return next({
127-
log: `Error in marketplaceController.cloneProjects. Window username did not match the corresponding db username: ${err}`,
128-
message: {
129-
err: 'Error in marketplaceController.cloneProjects. Window username did not match the corresponding db username, check server logs for details'
130-
}
131-
});
132-
}
133-
//adding the current user's username and userID since the project is now cloned
134-
updatedProject.username = user.username;
135-
updatedProject.userId = currentuserID;
136-
updatedProject.project.forked = true; // updated the forked tag
118+
const userId = req.cookies.ssid;
119+
const username = req.cookies.username;
120+
try { // trying to find project, update its userId and username to a new project, then save it
121+
const originalProject = await Projects.findOne({ _id: req.params.docId }).exec();
122+
const updatedProject = originalProject.toObject({ minimize: false }); // minimize false makes sure Mongoose / MongoDB does not remove nested properties with values of empty objects {}
123+
updatedProject.userId = userId;
124+
updatedProject.project.forked = true;
125+
updatedProject.published = false;
126+
updatedProject.forked = `Forked from ${updatedProject.username}`; // add forked tag with current project owner username
127+
updatedProject.username = username; // then switch to the cloning username
137128
delete updatedProject._id; // removes the old project id from the object
138129
updatedProject.createdAt = Date.now();
139-
updatedProject.published = false;
140-
141-
Projects.create(
142-
// creates a copy of the project to the user's library with a new generated _id
143-
updatedProject,
144-
(err, result) => {
145-
if (err) {
146-
return next({
147-
log: `Error in marketplaceController.cloneProject: ${err}`,
148-
message: {
149-
err: 'Error in marketplaceController.cloneProject, check server logs for details'
150-
}
151-
});
152-
}
153-
res.locals.clonedProject = result;
154-
return next();
130+
const clonedProject = await Projects.create(updatedProject);
131+
res.locals.clonedProject = clonedProject.toObject({ minimize: false }); // need to convert back to an object to send to frontend, again make sure minimize is false
132+
return next();
133+
}
134+
catch (err) {
135+
return next({
136+
log: `Error in marketplaceController.cloneProject: ${err}`,
137+
message: {
138+
err: 'Error in marketplaceController.cloneProject, check server logs for details'
155139
}
156-
);
157-
})
140+
});
141+
}
158142
},
159143
};
160144
export default marketplaceController;

server/controllers/userController.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ const userController: UserController = {
7676
// if no error found when creating a new user, send back user ID in res.locals
7777
res.locals.id = newUser.id;
7878
// send back username to store on cookies for forking projects
79-
console.log(username);
8079
res.locals.username = username;
8180
return next();
8281
}

server/server.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,8 @@ app.get(
218218
);
219219

220220
// Clone from marketplace
221-
app.post(
222-
'/cloneProject',
223-
sessionController.isLoggedIn,
221+
app.get(
222+
'/cloneProject/:docId',
224223
marketplaceController.cloneProject,
225224
(req, res) => res.status(200).json(res.locals.clonedProject)
226225
);

0 commit comments

Comments
 (0)