diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..cedd16b --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,36 @@ +name: UnitTCMS CI + +on: + push: + branches: [ "main", "develop" ] + pull_request: + branches: [ "main", "develop" ] + +jobs: + unittcms-test: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [20.x] + + steps: + - uses: actions/checkout@v4 + + # root + - name: Format and unit test + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm ci + - run: npm run format # prettier + - run: npm run test # vitest + + # frontend + - name: nextjs build + working-directory: ./frontend + run: npm ci + run: npm run build # nextjs build + diff --git a/backend/routes/users/signin.js b/backend/routes/users/signin.js index 9f16026..3b740f4 100644 --- a/backend/routes/users/signin.js +++ b/backend/routes/users/signin.js @@ -27,9 +27,9 @@ module.exports = function (sequelize) { return res.status(401).json({ error: 'Authentication failed' }); } const accessToken = jwt.sign({ userId: user.id }, secretKey, { - expiresIn: '1h', + expiresIn: '24h', }); - const expiresAt = Date.now() + 3600 * 1000; // expire date(ms) + const expiresAt = Date.now() + 3600 * 1000 * 24; // expire date(ms) res.status(200).json({ access_token: accessToken, expires_at: expiresAt, user }); } catch (error) { diff --git a/backend/routes/users/signup.js b/backend/routes/users/signup.js index ee7ed6e..8398f29 100644 --- a/backend/routes/users/signup.js +++ b/backend/routes/users/signup.js @@ -29,9 +29,9 @@ module.exports = function (sequelize) { }); const accessToken = jwt.sign({ userId: user.id }, secretKey, { - expiresIn: '1h', + expiresIn: '24h', }); - const expiresAt = Date.now() + 3600 * 1000; // expire date(ms) + const expiresAt = Date.now() + 3600 * 1000 * 24; // expire date(ms) user.password = undefined; res.status(200).json({ access_token: accessToken, expires_at: expiresAt, user }); diff --git a/frontend/components/ProjectDialog.tsx b/frontend/components/ProjectDialog.tsx index d6e3dd2..15de41c 100644 --- a/frontend/components/ProjectDialog.tsx +++ b/frontend/components/ProjectDialog.tsx @@ -12,17 +12,17 @@ import { ModalBody, ModalFooter, } from '@nextui-org/react'; -import { ProjectType, ProjectsMessages } from '@/types/project'; +import { ProjectType, ProjectDialogMessages } from '@/types/project'; type Props = { isOpen: boolean; editingProject: ProjectType | null; onCancel: () => void; onSubmit: (name: string, detail: string, isPublic: boolean) => void; - messages: ProjectsMessages; + projectDialogMessages: ProjectDialogMessages; }; -export default function ProjectDialog({ isOpen, editingProject, onCancel, onSubmit, messages }: Props) { +export default function ProjectDialog({ isOpen, editingProject, onCancel, onSubmit, projectDialogMessages }: Props) { const [projectName, setProjectName] = useState({ text: editingProject ? editingProject.name : '', isInvalid: false, @@ -83,7 +83,7 @@ export default function ProjectDialog({ isOpen, editingProject, onCancel, onSubm setProjectName({ text: '', isInvalid: true, - errorMessage: messages.pleaseEnter, + errorMessage: projectDialogMessages.pleaseEnter, }); return; @@ -101,11 +101,11 @@ export default function ProjectDialog({ isOpen, editingProject, onCancel, onSubm }} > - {messages.project} + {projectDialogMessages.project}