reorganize dirs for dockerize

This commit is contained in:
Danny Avila 2023-03-06 10:15:07 -05:00
parent 6ae154cc42
commit fca546af63
38 changed files with 1056 additions and 1970 deletions

4
.gitignore vendored
View file

@ -29,6 +29,8 @@ public/main.js.LICENSE.txt
# Deployed apps should consider commenting these lines out: # Deployed apps should consider commenting these lines out:
# see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git # see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git
node_modules/ node_modules/
api/node_modules/
client/node_modules/
bower_components/ bower_components/
# Floobits # Floobits
@ -40,7 +42,7 @@ bower_components/
# Environment # Environment
.env .env
cache.json cache.json
data/ api/data/
.eslintrc.js .eslintrc.js
src/style - official.css src/style - official.css

12
api/DockerFile Normal file
View file

@ -0,0 +1,12 @@
FROM node:latest
WORKDIR /api
# copy package.json into the container at /api
COPY package*.json /api/
# install dependencies
RUN npm install
# Copy the current directory contents into the container at /api
COPY . /api/
# Make port 80 available to the world outside this container
EXPOSE 80
# Run the app when the container launches
CMD ["npm", "start"]

View file

@ -10,7 +10,7 @@ const askBing = async ({ text, progressCallback, convo }) => {
// If the above doesn't work, provide all your cookies as a string instead // If the above doesn't work, provide all your cookies as a string instead
// cookies: '', // cookies: '',
debug: false, debug: false,
store: new KeyvFile({ filename: './data/cache.json' }) store: new KeyvFile({ filename: './api/data/cache.json' })
}); });
let options = { let options = {

View file

@ -12,7 +12,7 @@ const browserClient = async ({ text, progressCallback, convo }) => {
const { ChatGPTBrowserClient } = await import('@waylaidwanderer/chatgpt-api'); const { ChatGPTBrowserClient } = await import('@waylaidwanderer/chatgpt-api');
const store = { const store = {
store: new KeyvFile({ filename: './data/cache.json' }) store: new KeyvFile({ filename: './api/data/cache.json' })
}; };
const client = new ChatGPTBrowserClient(clientOptions, store); const client = new ChatGPTBrowserClient(clientOptions, store);

View file

@ -11,7 +11,7 @@ const clientOptions = {
const askClient = async ({ text, progressCallback, convo }) => { const askClient = async ({ text, progressCallback, convo }) => {
const ChatGPTClient = (await import('@waylaidwanderer/chatgpt-api')).default; const ChatGPTClient = (await import('@waylaidwanderer/chatgpt-api')).default;
const store = { const store = {
store: new KeyvFile({ filename: './data/cache.json' }) store: new KeyvFile({ filename: './api/data/cache.json' })
}; };
const client = new ChatGPTClient(process.env.OPENAI_KEY, clientOptions, store); const client = new ChatGPTClient(process.env.OPENAI_KEY, clientOptions, store);

View file

@ -11,7 +11,7 @@ const clientOptions = {
const customClient = async ({ text, progressCallback, convo, promptPrefix, chatGptLabel }) => { const customClient = async ({ text, progressCallback, convo, promptPrefix, chatGptLabel }) => {
const ChatGPTClient = (await import('@waylaidwanderer/chatgpt-api')).default; const ChatGPTClient = (await import('@waylaidwanderer/chatgpt-api')).default;
const store = { const store = {
store: new KeyvFile({ filename: './data/cache.json' }) store: new KeyvFile({ filename: './api/data/cache.json' })
}; };
clientOptions.chatGptLabel = chatGptLabel; clientOptions.chatGptLabel = chatGptLabel;

38
api/package.json Normal file
View file

@ -0,0 +1,38 @@
{
"name": "chatgpt-clone",
"version": "1.0.0",
"description": "",
"main": "server/index.js",
"scripts": {
"start": "npx node server/index.js",
"server-dev": "npx nodemon server/index.js"
},
"repository": {
"type": "git",
"url": "git+https://github.com/danny-avila/chatgpt-clone.git"
},
"keywords": [],
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/danny-avila/chatgpt-clone/issues"
},
"homepage": "https://github.com/danny-avila/chatgpt-clone#readme",
"dependencies": {
"@keyv/mongo": "^2.1.8",
"@waylaidwanderer/chatgpt-api": "^1.15.1",
"cors": "^2.8.5",
"dotenv": "^16.0.3",
"keyv": "^4.5.2",
"keyv-file": "^0.2.0",
"mongoose": "^6.9.0",
"openai": "^3.1.0",
"swr": "^2.0.3",
"tailwind-merge": "^1.9.1",
"tailwindcss-animate": "^1.0.5"
},
"devDependencies": {
"nodemon": "^2.0.20",
"path": "^0.12.7"
}
}

View file

@ -4,8 +4,8 @@ const path = require('path');
const cors = require('cors'); const cors = require('cors');
const routes = require('./routes'); const routes = require('./routes');
const app = express(); const app = express();
const port = 3050; const port = process.env.PORT || 3050;
const projectPath = path.join(__dirname, '..'); const projectPath = path.join(__dirname, '..', '..');
dbConnect().then(() => console.log('Connected to MongoDB')); dbConnect().then(() => console.log('Connected to MongoDB'));
app.use(cors()); app.use(cors());

2921
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,27 +1,27 @@
{ {
"name": "rpp2210-mvp", "name": "chatgpt-clone",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"start": "webpack-dev-server .", "start": "webpack-dev-server .",
"build": "Webpack .", "build": "Webpack .",
"server": "npx node server/index.js", "server": "npx node api/server/index.js",
"build-dev": "Webpack . --watch", "build-dev": "Webpack . --watch",
"server-dev": "npx nodemon server/index.js", "server-dev": "npx nodemon api/server/index.js",
"test": "test" "test": "test"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git+https://github.com/danny-avila/rpp2210-mvp.git" "url": "git+https://github.com/danny-avila/chatgpt-clone.git"
}, },
"keywords": [], "keywords": [],
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"bugs": { "bugs": {
"url": "https://github.com/danny-avila/rpp2210-mvp/issues" "url": "https://github.com/danny-avila/chatgpt-clone/issues"
}, },
"homepage": "https://github.com/danny-avila/rpp2210-mvp#readme", "homepage": "https://github.com/danny-avila/chatgpt-clone#readme",
"dependencies": { "dependencies": {
"@keyv/mongo": "^2.1.8", "@keyv/mongo": "^2.1.8",
"@radix-ui/react-alert-dialog": "^1.0.2", "@radix-ui/react-alert-dialog": "^1.0.2",
@ -32,7 +32,6 @@
"@reduxjs/toolkit": "^1.9.2", "@reduxjs/toolkit": "^1.9.2",
"@vscode/vscode-languagedetection": "^1.0.22", "@vscode/vscode-languagedetection": "^1.0.22",
"@waylaidwanderer/chatgpt-api": "^1.15.1", "@waylaidwanderer/chatgpt-api": "^1.15.1",
"chatgpt": "^4.2.0",
"class-variance-authority": "^0.4.0", "class-variance-authority": "^0.4.0",
"clsx": "^1.2.1", "clsx": "^1.2.1",
"cors": "^2.8.5", "cors": "^2.8.5",
@ -50,7 +49,6 @@
"react-redux": "^8.0.5", "react-redux": "^8.0.5",
"react-textarea-autosize": "^8.4.0", "react-textarea-autosize": "^8.4.0",
"react-transition-group": "^4.4.5", "react-transition-group": "^4.4.5",
"remark-supersub": "^1.0.0",
"swr": "^2.0.3", "swr": "^2.0.3",
"tailwind-merge": "^1.9.1", "tailwind-merge": "^1.9.1",
"tailwindcss-animate": "^1.0.5", "tailwindcss-animate": "^1.0.5",

View file

@ -23,8 +23,8 @@ export default function Conversation({
const { modelMap } = useSelector((state) => state.models); const { modelMap } = useSelector((state) => state.models);
const inputRef = useRef(null); const inputRef = useRef(null);
const dispatch = useDispatch(); const dispatch = useDispatch();
const { trigger } = manualSWR(`http://localhost:3050/messages/${id}`, 'get'); const { trigger } = manualSWR(`http://localhost:3080/messages/${id}`, 'get');
const rename = manualSWR(`http://localhost:3050/convos/update`, 'post'); const rename = manualSWR(`http://localhost:3080/convos/update`, 'post');
const clickHandler = async () => { const clickHandler = async () => {
if (conversationId === id) { if (conversationId === id) {

View file

@ -9,7 +9,7 @@ import { setMessages } from '~/store/messageSlice';
export default function DeleteButton({ conversationId, renaming, cancelHandler }) { export default function DeleteButton({ conversationId, renaming, cancelHandler }) {
const dispatch = useDispatch(); const dispatch = useDispatch();
const { trigger } = manualSWR( const { trigger } = manualSWR(
'http://localhost:3050/convos/clear', `http://localhost:3080/convos/clear`,
'post', 'post',
() => { () => {
dispatch(setMessages([])); dispatch(setMessages([]));

View file

@ -23,7 +23,7 @@ export default function ModelDialog({ mutate, modelMap }) {
const [saveText, setSaveText] = useState('Save'); const [saveText, setSaveText] = useState('Save');
const [required, setRequired] = useState(false); const [required, setRequired] = useState(false);
const inputRef = useRef(null); const inputRef = useRef(null);
const updateCustomGpt = manualSWR('http://localhost:3050/customGpts/', 'post'); const updateCustomGpt = manualSWR(`http://localhost:3080/customGpts/`, 'post');
const submitHandler = (e) => { const submitHandler = (e) => {
if (chatGptLabel.length === 0) { if (chatGptLabel.length === 0) {

View file

@ -25,7 +25,7 @@ export default function ModelMenu() {
const dispatch = useDispatch(); const dispatch = useDispatch();
const { model, customModel } = useSelector((state) => state.submit); const { model, customModel } = useSelector((state) => state.submit);
const { models, modelMap, initial } = useSelector((state) => state.models); const { models, modelMap, initial } = useSelector((state) => state.models);
const { trigger } = manualSWR('http://localhost:3050/customGpts', 'get', (res) => { const { trigger } = manualSWR(`http://localhost:3080/customGpts`, 'get', (res) => {
console.log('models data (response)', res); console.log('models data (response)', res);
if (models.length + res.length === models.length) { if (models.length + res.length === models.length) {
return; return;

View file

@ -11,12 +11,12 @@ export default function ClearConvos() {
const { mutate } = useSWRConfig() const { mutate } = useSWRConfig()
const { trigger } = manualSWR( const { trigger } = manualSWR(
'http://localhost:3050/convos/clear', `http://localhost:3080/convos/clear`,
'post', 'post',
() => { () => {
dispatch(setMessages([])); dispatch(setMessages([]));
dispatch(setConversation({ error: false, title: 'New chat', conversationId: null, parentMessageId: null })); dispatch(setConversation({ error: false, title: 'New chat', conversationId: null, parentMessageId: null }));
mutate('http://localhost:3050/convos'); mutate(`http://localhost:3080/convos`);
} }
); );

View file

@ -17,7 +17,7 @@ export default function Nav() {
}; };
const { data, isLoading, mutate } = swr( const { data, isLoading, mutate } = swr(
`http://localhost:3050/convos?pageNumber=${pageNumber}` `http://localhost:3080/convos?pageNumber=${pageNumber}`
, onSuccess); , onSuccess);
const containerRef = useRef(null); const containerRef = useRef(null);
const scrollPositionRef = useRef(null); const scrollPositionRef = useRef(null);

View file

@ -29,7 +29,10 @@ const currentSlice = createSlice({
state.pageNumber = state.pageNumber + 1; state.pageNumber = state.pageNumber + 1;
}, },
setConvos: (state, action) => { setConvos: (state, action) => {
state.convos = [...state.convos, ...action.payload]; const newConvos = action.payload.filter((convo) => {
return !state.convos.some((c) => c.conversationId === convo.conversationId);
});
state.convos = [...state.convos, ...newConvos];
}, },
} }
}); });

View file

@ -1,5 +1,4 @@
import { SSE } from '../../app/sse'; import { SSE } from './sse';
const endpoint = 'http://localhost:3050/ask';
// const newLineRegex = /^\n+/; // const newLineRegex = /^\n+/;
export default function handleSubmit({ export default function handleSubmit({
@ -12,6 +11,7 @@ export default function handleSubmit({
chatGptLabel, chatGptLabel,
promptPrefix promptPrefix
}) { }) {
const endpoint = `http://localhost:3080/ask`;
let payload = { model, text, chatGptLabel, promptPrefix }; let payload = { model, text, chatGptLabel, promptPrefix };
if (convo.conversationId && convo.parentMessageId) { if (convo.conversationId && convo.parentMessageId) {
payload = { payload = {