# migrations

dir: embeddings_queue
filename: 00001-embeddings.sqlite.sql
hash: d3755dfd232be8e8301f4d7fcfb3a486
sql:
CREATE TABLE embeddings_queue (
    seq_id INTEGER PRIMARY KEY,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    operation INTEGER NOT NULL,
    topic TEXT NOT NULL,
    id TEXT NOT NULL,
    vector BLOB,
    encoding TEXT,
    metadata TEXT
);


dir: sysdb
filename: 00001-collections.sqlite.sql
hash: 38352d725ad1c16074fac420b22b4633
sql:
CREATE TABLE collections (
    id TEXT PRIMARY KEY,
    name TEXT NOT NULL,
    topic TEXT NOT NULL,
    UNIQUE (name)
);

CREATE TABLE collection_metadata (
    collection_id TEXT REFERENCES collections(id) ON DELETE CASCADE,
    key TEXT NOT NULL,
    str_value TEXT,
    int_value INTEGER,
    float_value REAL,
    PRIMARY KEY (collection_id, key)
);


dir: sysdb
filename: 00002-segments.sqlite.sql
hash: 2913cb6a503055a95f625448037e8912
sql:
CREATE TABLE segments (
    id TEXT PRIMARY KEY,
    type TEXT NOT NULL,
    scope TEXT NOT NULL,
    topic TEXT,
    collection TEXT REFERENCES collection(id)
);

CREATE TABLE segment_metadata (
    segment_id TEXT  REFERENCES segments(id) ON DELETE CASCADE,
    key TEXT NOT NULL,
    str_value TEXT,
    int_value INTEGER,
    float_value REAL,
    PRIMARY KEY (segment_id, key)
);


dir: metadb
filename: 00001-embedding-metadata.sqlite.sql
hash: 2b4cf52c4bb2676e21d6860a4409f856
sql:
CREATE TABLE embeddings (
    id INTEGER PRIMARY KEY,
    segment_id TEXT NOT NULL,
    embedding_id TEXT NOT NULL,
    seq_id BLOB NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE (segment_id, embedding_id)
);

CREATE TABLE embedding_metadata (
    id INTEGER REFERENCES embeddings(id),
    key TEXT NOT NULL,
    string_value TEXT,
    int_value INTEGER,
    float_value REAL,
    PRIMARY KEY (id, key)
);

CREATE TABLE max_seq_id (
    segment_id TEXT PRIMARY KEY,
    seq_id BLOB NOT NULL
);

CREATE VIRTUAL TABLE embedding_fulltext USING fts5(id, string_value);


dir: metadb
filename: 00002-embedding-metadata.sqlite.sql
hash: 12a570f7121b3a8ce750a2a7c36da20f
sql:
-- SQLite does not support adding check with alter table, as a result, adding a check
-- involve creating a new table and copying the data over. It is over kill with adding
-- a boolean type column. The application write to the table needs to ensure the data
-- integrity.
ALTER TABLE embedding_metadata ADD COLUMN bool_value INTEGER


dir: metadb
filename: 00003-full-text-tokenize.sqlite.sql
hash: f97ad6334aeaa8f419f01110b648b97a
sql:
CREATE VIRTUAL TABLE embedding_fulltext_search USING fts5(string_value, tokenize='trigram');
INSERT INTO embedding_fulltext_search (rowid, string_value) SELECT rowid, string_value FROM embedding_metadata;
DROP TABLE embedding_fulltext;


# embeddings_queue

created_at: 2024-07-14 06:13:49
topic: persistent://default/default/a732dde4-2aa8-4bbc-b876-b96d276bd6e7
id: b16a6c04-e3f0-4c32-bfff-6c2b1eab9a14
encoding: FLOAT32
metadata:
{"source": "./user_file/vonhuy777@gmail.com/DEMO1.docx", "chroma:document": "\u0110\u1ea0I H\u1eccC QU\u1ed0C GIA TP.HCM\n\nTR\u01af\u1edcNG \u0110\u1ea0I H\u1eccC B\u00c1CH KHOA\n\nKHOA KHOA H\u1eccC V\u00c0 K\u1ef8 THU\u1eacT M\u00c1Y T\u00cdNH\n\nB\u00c1O C\u00c1O\n\nTH\u1ef0C T\u1eacP NGO\u00c0I TR\u01af\u1edcNG\n\nH\u1eccC K\u1ef2: 3 - N\u0102M H\u1eccC: 2022-2023\n\nNG\u00c0NH: K\u1ef9 thu\u1eadt m\u00e1y t\u00ednh\n\nCH\u01af\u01a0NG TR\u00ccNH \u0110\u00c0O T\u1ea0O: Ch\u00ednh quy\n\n\u0110\u01a0N V\u1eca/ DOANH NGHI\u1ec6P NH\u1eacN TH\u1ef0C T\u1eacP:\n\nC\u00f4ng ty TNHH Ph\u1ea7n m\u1ec1m FPT H\u1ed3 Ch\u00ed Minh.\n\nC\u00c1N B\u1ed8 H\u01af\u1edaNG D\u1eaaN CHUY\u00caN M\u00d4N TR\u1ef0C TI\u1ebeP C\u1ee6A \u0110\u01a0N V\u1eca/ DOANH NGHI\u1ec6P:\n\nNguy\u1ec5n T\u1ea5n Th\u00e0nh (Mentor).\n\nNguy\u1ec5n \u0110o\u00e0n Di\u1ec7p Ng\u00e2n (Admin).\n\nC\u00c1N B\u1ed8 H\u01af\u1edaNG D\u1eaaN/ GI\u00c1M S\u00c1T/ CH\u1ea4M \u0110I\u1ec2M B\u00c1O C\u00c1O C\u1ee6A KHOA (CBHD/CBGS/C\u0110BC):\n\n\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026...\n\nSINH VI\u00caN TH\u1ef0C HI\u1ec6N (SVTH):\n\nH\u1ecc V\u00c0 T\u00caN: Nguy\u1ec5n Ph\u01b0\u1edbc Th\u1ecbnh \u2013 MSSV: 1915317\n\nTP. H\u1ed2 CH\u00cd MINH, NG\u00c0Y 10 TH\u00c1NG 8 N\u0102M 2023\n\n\u0110\u1ea0I H\u1eccC QU\u1ed0C GIA TP.HCM\n\nTR\u01af\u1edcNG \u0110\u1ea0I H\u1eccC B\u00c1CH KHOA\n\nKHOA KHOA H\u1eccC V\u00c0 K\u1ef8 THU\u1eacT M\u00c1Y T\u00cdNH\n\nB\u00c1O C\u00c1O\n\nTH\u1ef0C T\u1eacP NGO\u00c0I TR\u01af\u1edcNG\n\nH\u1eccC K\u1ef2: 3 - N\u0102M H\u1eccC: 2022-2023\n\nNG\u00c0NH: K\u1ef9 thu\u1eadt m\u00e1y t\u00ednh\n\nCH\u01af\u01a0NG TR\u00ccNH \u0110\u00c0O T\u1ea0O: Ch\u00ednh quy\n\n\u0110\u01a0N V\u1eca/ DOANH NGHI\u1ec6P NH\u1eacN TH\u1ef0C T\u1eacP:\n\nC\u00f4ng ty TNHH Ph\u1ea7n m\u1ec1m FPT H\u1ed3 Ch\u00ed Minh.\n\nC\u00c1N B\u1ed8 H\u01af\u1edaNG D\u1eaaN CHUY\u00caN M\u00d4N TR\u1ef0C TI\u1ebeP C\u1ee6A \u0110\u01a0N V\u1eca/ DOANH NGHI\u1ec6P:\n\nNguy\u1ec5n T\u1ea5n Th\u00e0nh (Mentor).\n\nNguy\u1ec5n \u0110o\u00e0n Di\u1ec7p Ng\u00e2n (Admin).\n\nC\u00c1N B\u1ed8 H\u01af\u1edaNG D\u1eaaN/ GI\u00c1M S\u00c1T/ CH\u1ea4M \u0110I\u1ec2M B\u00c1O C\u00c1O C\u1ee6A KHOA (CBHD/CBGS/C\u0110BC):\n\n\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026...\n\nSINH VI\u00caN TH\u1ef0C HI\u1ec6N (SVTH):\n\nH\u1ecc V\u00c0 T\u00caN: Nguy\u1ec5n Ph\u01b0\u1edbc Th\u1ecbnh \u2013 MSSV: 1915317\n\nTP. H\u1ed2 CH\u00cd MINH, NG\u00c0Y 10 TH\u00c1NG 8 N\u0102M 2023\n\n\nM\u1ee4C L\u1ee4C\n\n\tCH\u01af\u01a0NG 1: GI\u1edaI THI\u1ec6U V\u1ec0 C\u00d4NG TY FPT-SOFTWARE\t3\n\n\tCH\u01af\u01a0NG 2: T\u1ed4NG QUAN V\u1ec0 SPRING TRONG JAVA\t4\n\n\t\t1.\tSpring MVC\t4\n\n\t\t2.\tSpring Boot\t4\n\n\t\t3.\tSpring JPA\t4\n\n\t\t4.\tSpring Security\t5\n\n\t\t5.\tJWT\t5\n\n\t\t6.\tRest Controller\t5\n\n\t\t7.\tRest Template\t6\n\n\tCH\u01af\u01a0NG 3: Y\u00caU C\u1ea6U C\u1ee6A D\u1ef0 \u00c1N\t7\n\n\tCH\u01af\u01a0NG 4: QU\u00c1 TR\u00ccNH L\u00c0M VI\u1ec6C C\u1ee6A C\u00c1 NH\u00c2N\t8\n\n\t\t1.\tH\u1ecdc c\u00e1ch s\u1eed d\u1ee5ng Git Lab\t8\n\n\t\t2.\tV\u1ebd ERD\t8\n\n\t\t3.\tX\u00e2y d\u1ef1ng c\u00e1c th\u1ef1c th\u1ec3 (Entity)\t8\n\n\t\t4.\tX\u00e2y d\u1ef1ng Repository\t10\n\n\t\t5.\tX\u00e2y d\u1ef1ng Service v\u00e0 ServiceImpl\t10\n\n\t\t6.\tX\u00e2y d\u1ef1ng Controller\t12\n\n\t\t7.\tMerge code, Fix bug v\u00e0 ho\u00e0n thi\u1ec7n project\t14\n\n\tCH\u01af\u01a0NG 5: T\u1ed4NG K\u1ebeT\t14\n\nCH\u01af\u01a0NG 1: GI\u1edaI THI\u1ec6U V\u1ec0 C\u00d4NG TY FPT-SOFTWARE\n\nFPT Software l\u00e0 t\u00ean g\u1ecdi kh\u00e1c c\u1ee7a c\u00f4ng ty TNHH Ph\u1ea7n M\u1ec1m FPT v\u1edbi nhi\u1ec7m v\u1ee5 ch\u00ednh l\u00e0 gia c\u00f4ng ph\u1ea7n m\u1ec1m t\u1ea1i Vi\u1ec7t Nam v\u00e0 n\u01b0\u1edbc ngo\u00e0i.\n\nTh\u00e0nh l\u1eadp t\u1eeb n\u0103m 1988 \u0111\u1ebfn nay v\u1edbi 3 Tr\u1ee5 s\u1edf ch\u00ednh FPT Software \u0111\u1eb7t t\u1ea1i Vi\u1ec7t Nam v\u00e0 m\u1ed9t s\u1ed1 n\u01b0\u1edbc tr\u00ean to\u00e0n th\u1ebf gi\u1edbi nh\u01b0 Hoa K\u1ef3, Nh\u1eadt B\u1ea3n, Malaysia, \u0110\u1ee9c, \u00dac, Singapore, Malaysia, Th\u00e1i Lan v\u00e0 Philipines hi\u1ec7n FPT Software \u0111\u00e1p \u1ee9ng nhu c\u1ea7u gia c\u00f4ng ph\u1ea7n m\u1ec1m l\u1edbn cho h\u01a1n 150 c\u00f4ng ty h\u00e0ng \u0111\u1ea7u t\u1ea1i 20 qu\u1ed1c gia l\u1edbn nh\u1ea5t tr\u00ean th\u1ebf gi\u1edbi hi\u1ec7n nay v\u1edbi c\u00e1c h\u1ee3p \u0111\u1ed3ng l\u1edbn c\u00f3 khi \u0111\u1ea1t c\u1ea3 1 tri\u1ec7u USD d\u00e0nh cho m\u1ed9t s\u1ed1 \u0111\u1ed1i t\u00e1c l\u1edbn nh\u01b0 Hitachi, NEOPOST, Petronas, Deutsche Bank, v\u00e0 Unilever v\u1edbi h\u01a1n 4000 nh\u00e2n vi\u00ean tr\u00ean to\u00e0n th\u1ebf gi\u1edbi.\n\nFPT Software theo \u0111u\u1ed5i m\u1ee5c ti\u00eau gia c\u00f4ng ph\u1ea7n m\u1ec1m \u0111\u1ec3 \u0111\u00e1p \u1ee9ng cho nhu c\u1ea7u ph\u00e1t tri\u1ec3n CNTT c\u1ee7a c\u00e1c h\u00e3ng ph\u1ea7n m\u1ec1m trong n\u01b0\u1edbc, c\u00e1c c\u00f4ng ty l\u1edbn trong n\u01b0\u1edbc v\u00e0 tham v\u1ecdng h\u01a1n l\u00e0 xu\u1ea5t kh\u1ea9u ph\u1ea7n m\u1ec1m tr\u00ean to\u00e0n th\u1ebf gi\u1edbi cho c\u00e1c c\u00f4ng ty n\u01b0\u1edbc ngo\u00e0i bi\u1ebft \u0111\u1ebfn t\u1eadp \u0111o\u00e0n FPT, m\u1ee5c \u0111\u00edch ch\u00ednh l\u00e0 v\u01b0\u01a1n \u0111\u1ebfn t\u1ea7m cao m\u1edbi th\u00f4ng qua c\u00f4ng ngh\u1ec7 nh\u1eb1m n\u00e2ng cao n\u0103ng su\u1ea5t lao \u0111\u1ed9ng."}


created_at: 2024-07-14 06:13:49
topic: persistent://default/default/a732dde4-2aa8-4bbc-b876-b96d276bd6e7
id: f56edadd-52d0-4613-8963-0001889a51f2
encoding: FLOAT32
metadata:
{"source": "./user_file/vonhuy777@gmail.com/DEMO1.docx", "chroma:document": "2.\tSpring Boot\t4\n\n\t\t3.\tSpring JPA\t4\n\n\t\t4.\tSpring Security\t5\n\n\t\t5.\tJWT\t5\n\n\t\t6.\tRest Controller\t5\n\n\t\t7.\tRest Template\t6\n\n\tCH\u01af\u01a0NG 3: Y\u00caU C\u1ea6U C\u1ee6A D\u1ef0 \u00c1N\t7\n\n\tCH\u01af\u01a0NG 4: QU\u00c1 TR\u00ccNH L\u00c0M VI\u1ec6C C\u1ee6A C\u00c1 NH\u00c2N\t8\n\n\t\t1.\tH\u1ecdc c\u00e1ch s\u1eed d\u1ee5ng Git Lab\t8\n\n\t\t2.\tV\u1ebd ERD\t8\n\n\t\t3.\tX\u00e2y d\u1ef1ng c\u00e1c th\u1ef1c th\u1ec3 (Entity)\t8\n\n\t\t4.\tX\u00e2y d\u1ef1ng Repository\t10\n\n\t\t5.\tX\u00e2y d\u1ef1ng Service v\u00e0 ServiceImpl\t10\n\n\t\t6.\tX\u00e2y d\u1ef1ng Controller\t12\n\n\t\t7.\tMerge code, Fix bug v\u00e0 ho\u00e0n thi\u1ec7n project\t14\n\n\tCH\u01af\u01a0NG 5: T\u1ed4NG K\u1ebeT\t14\n\nCH\u01af\u01a0NG 1: GI\u1edaI THI\u1ec6U V\u1ec0 C\u00d4NG TY FPT-SOFTWARE\n\nFPT Software l\u00e0 t\u00ean g\u1ecdi kh\u00e1c c\u1ee7a c\u00f4ng ty TNHH Ph\u1ea7n M\u1ec1m FPT v\u1edbi nhi\u1ec7m v\u1ee5 ch\u00ednh l\u00e0 gia c\u00f4ng ph\u1ea7n m\u1ec1m t\u1ea1i Vi\u1ec7t Nam v\u00e0 n\u01b0\u1edbc ngo\u00e0i.\n\nTh\u00e0nh l\u1eadp t\u1eeb n\u0103m 1988 \u0111\u1ebfn nay v\u1edbi 3 Tr\u1ee5 s\u1edf ch\u00ednh FPT Software \u0111\u1eb7t t\u1ea1i Vi\u1ec7t Nam v\u00e0 m\u1ed9t s\u1ed1 n\u01b0\u1edbc tr\u00ean to\u00e0n th\u1ebf gi\u1edbi nh\u01b0 Hoa K\u1ef3, Nh\u1eadt B\u1ea3n, Malaysia, \u0110\u1ee9c, \u00dac, Singapore, Malaysia, Th\u00e1i Lan v\u00e0 Philipines hi\u1ec7n FPT Software \u0111\u00e1p \u1ee9ng nhu c\u1ea7u gia c\u00f4ng ph\u1ea7n m\u1ec1m l\u1edbn cho h\u01a1n 150 c\u00f4ng ty h\u00e0ng \u0111\u1ea7u t\u1ea1i 20 qu\u1ed1c gia l\u1edbn nh\u1ea5t tr\u00ean th\u1ebf gi\u1edbi hi\u1ec7n nay v\u1edbi c\u00e1c h\u1ee3p \u0111\u1ed3ng l\u1edbn c\u00f3 khi \u0111\u1ea1t c\u1ea3 1 tri\u1ec7u USD d\u00e0nh cho m\u1ed9t s\u1ed1 \u0111\u1ed1i t\u00e1c l\u1edbn nh\u01b0 Hitachi, NEOPOST, Petronas, Deutsche Bank, v\u00e0 Unilever v\u1edbi h\u01a1n 4000 nh\u00e2n vi\u00ean tr\u00ean to\u00e0n th\u1ebf gi\u1edbi.\n\nFPT Software theo \u0111u\u1ed5i m\u1ee5c ti\u00eau gia c\u00f4ng ph\u1ea7n m\u1ec1m \u0111\u1ec3 \u0111\u00e1p \u1ee9ng cho nhu c\u1ea7u ph\u00e1t tri\u1ec3n CNTT c\u1ee7a c\u00e1c h\u00e3ng ph\u1ea7n m\u1ec1m trong n\u01b0\u1edbc, c\u00e1c c\u00f4ng ty l\u1edbn trong n\u01b0\u1edbc v\u00e0 tham v\u1ecdng h\u01a1n l\u00e0 xu\u1ea5t kh\u1ea9u ph\u1ea7n m\u1ec1m tr\u00ean to\u00e0n th\u1ebf gi\u1edbi cho c\u00e1c c\u00f4ng ty n\u01b0\u1edbc ngo\u00e0i bi\u1ebft \u0111\u1ebfn t\u1eadp \u0111o\u00e0n FPT, m\u1ee5c \u0111\u00edch ch\u00ednh l\u00e0 v\u01b0\u01a1n \u0111\u1ebfn t\u1ea7m cao m\u1edbi th\u00f4ng qua c\u00f4ng ngh\u1ec7 nh\u1eb1m n\u00e2ng cao n\u0103ng su\u1ea5t lao \u0111\u1ed9ng.\n\nKinh doanh c\u1ee7a FPT Software xu\u1ea5t ph\u00e1t t\u1eeb C\u00f4ng ngh\u1ec7 th\u00f4ng tin v\u00e0 Vi\u1ec5n Th\u00f4ng FPT l\u00e0 c\u1ed1t l\u00f5i \u0111\u1ec3 \u0111\u00e1p \u1ee9ng cho kh\u00e1ch h\u00e0ng tr\u00ean 63 t\u1ec9nh th\u00e0nh tr\u00ean to\u00e0n l\u00e3nh th\u1ed5 Vi\u1ec7t Nam v\u00e0 m\u1edf r\u1ed9ng \u0111\u1ebfn kh\u00e1ch h\u00e0ng to\u00e0n c\u1ea7u. T\u1eeb khi \u0111\u01b0\u1ee3c th\u00e0nh l\u1eadp cho \u0111\u1ebfn nay, FPT Software \u0111\u00e3 l\u00e0 c\u00f4ng ty ph\u1ea7n m\u1ec1m s\u1ed1 1 t\u1ea1i Vi\u1ec7t Nam trong l\u0129nh v\u1ef1c t\u00edch h\u1ee3p h\u1ec7 th\u1ed1ng, ph\u00e2n ph\u1ed1i v\u00e0 b\u00e1n l\u1ebb, d\u1ecbch v\u1ee5 C\u00f4ng Ngh\u1ec7 Th\u00f4ng tin, xu\u1ea5t kh\u1ea9u gia c\u00f4ng ph\u1ea7n m\u1ec1m, b\u00e1n l\u1ebb s\u1ea3n ph\u1ea9m CNTT.\n\n\u1ede l\u0129nh v\u1ef1c Vi\u1ec5n Th\u00f4ng FPT l\u00e0 m\u1ed9t trong 3 nh\u00e0 cung c\u1ea5p d\u1ecbch v\u1ee5 internet c\u00e1p quang FPT h\u00e0ng \u0111\u1ea7u t\u1ea1i Vi\u1ec7t Nam. V\u1ec1 l\u0129nh v\u1ef1c qu\u1ea3ng c\u00e1o, FPT l\u00e0 \u0111\u01a1n v\u1ecb qu\u1ea3ng c\u00e1o tr\u1ef1c tuy\u1ebfn s\u1ed1 1 t\u1ea1i Vi\u1ec7t Nam th\u00f4ng qua trang b\u00e1o \u0111i\u1ec7n t\u1eed VNexpress v\u1edbi h\u01a1n 42 tri\u1ec7u l\u01b0\u1ee3t truy c\u1eadp m\u1ed7i ng\u00e0y.\n\n\nCH\u01af\u01a0NG 2: T\u1ed4NG QUAN V\u1ec0 SPRING TRONG JAVA\n\nSpring MVC\n\nSpring Web model-view-controller framework (MVC) \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf xung quanh m\u1ed9t DispatcherServlet \u0111\u1ec3 g\u1eedi c\u00e1c y\u00eau c\u1ea7u t\u1edbi c\u00e1c tr\u00ecnh x\u1eed l\u00fd, v\u1edbi \u00e1nh x\u1ea1 tr\u00ecnh x\u1eed l\u00fd c\u00f3 th\u1ec3 \u0111\u1ecbnh c\u1ea5u h\u00ecnh, \u0111\u1ed9 ph\u00e2n gi\u1ea3i ch\u1ebf \u0111\u1ed9 xem, ng\u00f4n ng\u1eef v\u00e0 \u0111\u1ed9 ph\u00e2n gi\u1ea3i ch\u1ee7 \u0111\u1ec1 c\u0169ng nh\u01b0 h\u1ed7 tr\u1ee3 t\u1ea3i t\u1ec7p l\u00ean. Tr\u00ecnh x\u1eed l\u00fd m\u1eb7c \u0111\u1ecbnh d\u1ef1a tr\u00ean c\u00e1c ch\u00fa th\u00edch(annotation) @Controller v\u00e0 @RequestMapping, cung c\u1ea5p nhi\u1ec1u ph\u01b0\u01a1ng th\u1ee9c x\u1eed l\u00fd linh ho\u1ea1t. V\u1edbi s\u1ef1 ra \u0111\u1eddi c\u1ee7a Spring 3.0, c\u01a1 ch\u1ebf @Controller c\u0169ng cho ph\u00e9p b\u1ea1n t\u1ea1o c\u00e1c trang Web v\u00e0 \u1ee9ng d\u1ee5ng RESTful, th\u00f4ng qua ch\u00fa th\u00edch @PathVariable v\u00e0 c\u00e1c t\u00ednh n\u0103ng kh\u00e1c."}


created_at: 2024-07-14 06:13:49
topic: persistent://default/default/a732dde4-2aa8-4bbc-b876-b96d276bd6e7
id: 8055c30e-d2e0-4022-b7a3-ba0ee521f559
encoding: FLOAT32
metadata:
{"source": "./user_file/vonhuy777@gmail.com/DEMO1.docx", "chroma:document": "Kinh doanh c\u1ee7a FPT Software xu\u1ea5t ph\u00e1t t\u1eeb C\u00f4ng ngh\u1ec7 th\u00f4ng tin v\u00e0 Vi\u1ec5n Th\u00f4ng FPT l\u00e0 c\u1ed1t l\u00f5i \u0111\u1ec3 \u0111\u00e1p \u1ee9ng cho kh\u00e1ch h\u00e0ng tr\u00ean 63 t\u1ec9nh th\u00e0nh tr\u00ean to\u00e0n l\u00e3nh th\u1ed5 Vi\u1ec7t Nam v\u00e0 m\u1edf r\u1ed9ng \u0111\u1ebfn kh\u00e1ch h\u00e0ng to\u00e0n c\u1ea7u. T\u1eeb khi \u0111\u01b0\u1ee3c th\u00e0nh l\u1eadp cho \u0111\u1ebfn nay, FPT Software \u0111\u00e3 l\u00e0 c\u00f4ng ty ph\u1ea7n m\u1ec1m s\u1ed1 1 t\u1ea1i Vi\u1ec7t Nam trong l\u0129nh v\u1ef1c t\u00edch h\u1ee3p h\u1ec7 th\u1ed1ng, ph\u00e2n ph\u1ed1i v\u00e0 b\u00e1n l\u1ebb, d\u1ecbch v\u1ee5 C\u00f4ng Ngh\u1ec7 Th\u00f4ng tin, xu\u1ea5t kh\u1ea9u gia c\u00f4ng ph\u1ea7n m\u1ec1m, b\u00e1n l\u1ebb s\u1ea3n ph\u1ea9m CNTT.\n\n\u1ede l\u0129nh v\u1ef1c Vi\u1ec5n Th\u00f4ng FPT l\u00e0 m\u1ed9t trong 3 nh\u00e0 cung c\u1ea5p d\u1ecbch v\u1ee5 internet c\u00e1p quang FPT h\u00e0ng \u0111\u1ea7u t\u1ea1i Vi\u1ec7t Nam. V\u1ec1 l\u0129nh v\u1ef1c qu\u1ea3ng c\u00e1o, FPT l\u00e0 \u0111\u01a1n v\u1ecb qu\u1ea3ng c\u00e1o tr\u1ef1c tuy\u1ebfn s\u1ed1 1 t\u1ea1i Vi\u1ec7t Nam th\u00f4ng qua trang b\u00e1o \u0111i\u1ec7n t\u1eed VNexpress v\u1edbi h\u01a1n 42 tri\u1ec7u l\u01b0\u1ee3t truy c\u1eadp m\u1ed7i ng\u00e0y.\n\n\nCH\u01af\u01a0NG 2: T\u1ed4NG QUAN V\u1ec0 SPRING TRONG JAVA\n\nSpring MVC\n\nSpring Web model-view-controller framework (MVC) \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf xung quanh m\u1ed9t DispatcherServlet \u0111\u1ec3 g\u1eedi c\u00e1c y\u00eau c\u1ea7u t\u1edbi c\u00e1c tr\u00ecnh x\u1eed l\u00fd, v\u1edbi \u00e1nh x\u1ea1 tr\u00ecnh x\u1eed l\u00fd c\u00f3 th\u1ec3 \u0111\u1ecbnh c\u1ea5u h\u00ecnh, \u0111\u1ed9 ph\u00e2n gi\u1ea3i ch\u1ebf \u0111\u1ed9 xem, ng\u00f4n ng\u1eef v\u00e0 \u0111\u1ed9 ph\u00e2n gi\u1ea3i ch\u1ee7 \u0111\u1ec1 c\u0169ng nh\u01b0 h\u1ed7 tr\u1ee3 t\u1ea3i t\u1ec7p l\u00ean. Tr\u00ecnh x\u1eed l\u00fd m\u1eb7c \u0111\u1ecbnh d\u1ef1a tr\u00ean c\u00e1c ch\u00fa th\u00edch(annotation) @Controller v\u00e0 @RequestMapping, cung c\u1ea5p nhi\u1ec1u ph\u01b0\u01a1ng th\u1ee9c x\u1eed l\u00fd linh ho\u1ea1t. V\u1edbi s\u1ef1 ra \u0111\u1eddi c\u1ee7a Spring 3.0, c\u01a1 ch\u1ebf @Controller c\u0169ng cho ph\u00e9p b\u1ea1n t\u1ea1o c\u00e1c trang Web v\u00e0 \u1ee9ng d\u1ee5ng RESTful, th\u00f4ng qua ch\u00fa th\u00edch @PathVariable v\u00e0 c\u00e1c t\u00ednh n\u0103ng kh\u00e1c.\n\nTrong Spring Web MVC, b\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng b\u1ea5t k\u1ef3 \u0111\u1ed1i t\u01b0\u1ee3ng n\u00e0o l\u00e0m \u0111\u1ed1i t\u01b0\u1ee3ng l\u1ec7nh ho\u1eb7c \u0111\u1ed1i t\u01b0\u1ee3ng h\u1ed7 tr\u1ee3 bi\u1ec3u m\u1eabu; b\u1ea1n kh\u00f4ng c\u1ea7n tri\u1ec3n khai giao di\u1ec7n ho\u1eb7c l\u1edbp c\u01a1 s\u1edf d\u00e0nh ri\u00eang cho khung. Li\u00ean k\u1ebft d\u1eef li\u1ec7u c\u1ee7a Spring r\u1ea5t linh ho\u1ea1t: v\u00ed d\u1ee5: n\u00f3 coi c\u00e1c ki\u1ec3u kh\u00f4ng kh\u1edbp l\u00e0 l\u1ed7i x\u00e1c th\u1ef1c m\u00e0 \u1ee9ng d\u1ee5ng c\u00f3 th\u1ec3 \u0111\u00e1nh gi\u00e1 ch\u1ee9 kh\u00f4ng ph\u1ea3i l\u00e0 l\u1ed7i h\u1ec7 th\u1ed1ng. Do \u0111\u00f3, b\u1ea1n kh\u00f4ng c\u1ea7n sao ch\u00e9p c\u00e1c thu\u1ed9c t\u00ednh c\u1ee7a \u0111\u1ed1i t\u01b0\u1ee3ng nghi\u1ec7p v\u1ee5 c\u1ee7a m\u00ecnh d\u01b0\u1edbi d\u1ea1ng c\u00e1c chu\u1ed7i \u0111\u01a1n gi\u1ea3n, ch\u01b0a \u0111\u01b0\u1ee3c nh\u1eadp trong c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng bi\u1ec3u m\u1eabu c\u1ee7a b\u1ea1n ch\u1ec9 \u0111\u1ec3 x\u1eed l\u00fd c\u00e1c l\u1ea7n g\u1eedi kh\u00f4ng h\u1ee3p l\u1ec7 ho\u1eb7c \u0111\u1ec3 chuy\u1ec3n \u0111\u1ed5i c\u00e1c Chu\u1ed7i \u0111\u00fang c\u00e1ch. Thay v\u00e0o \u0111\u00f3, t\u1ed1t h\u01a1n l\u00e0 li\u00ean k\u1ebft tr\u1ef1c ti\u1ebfp v\u1edbi c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng kinh doanh c\u1ee7a b\u1ea1n.\n\nSpring c\u00f3 nhi\u1ec1u c\u00f4ng c\u1ee5 c\u1ef1c k\u1ef3 linh ho\u1ea1t. B\u1ed9 \u0111i\u1ec1u khi\u1ec3n th\u01b0\u1eddng ch\u1ecbu tr\u00e1ch nhi\u1ec7m chu\u1ea9n b\u1ecb B\u1ea3n \u0111\u1ed3 m\u00f4 h\u00ecnh v\u1edbi d\u1eef li\u1ec7u v\u00e0 ch\u1ecdn t\u00ean ch\u1ebf \u0111\u1ed9 xem nh\u01b0ng n\u00f3 c\u0169ng c\u00f3 th\u1ec3 ghi tr\u1ef1c ti\u1ebfp v\u00e0o lu\u1ed3ng ph\u1ea3n h\u1ed3i v\u00e0 ho\u00e0n th\u00e0nh y\u00eau c\u1ea7u. \u0110\u1ed9 ph\u00e2n gi\u1ea3i t\u00ean c\u1ee7a ch\u1ebf \u0111\u1ed9 xem c\u00f3 th\u1ec3 \u0111\u1ecbnh c\u1ea5u h\u00ecnh cao th\u00f4ng qua ph\u1ea7n m\u1edf r\u1ed9ng t\u1ec7p ho\u1eb7c Ch\u1ea5p nh\u1eadn th\u01b0\u01a1ng l\u01b0\u1ee3ng lo\u1ea1i n\u1ed9i dung ti\u00eau \u0111\u1ec1, th\u00f4ng qua t\u00ean bean, t\u1ec7p thu\u1ed9c t\u00ednh ho\u1eb7c th\u1eadm ch\u00ed tri\u1ec3n khai ViewResolver t\u00f9y ch\u1ec9nh. M\u00f4 h\u00ecnh (M trong MVC) l\u00e0 giao di\u1ec7n B\u1ea3n \u0111\u1ed3, cho ph\u00e9p tr\u1eebu t\u01b0\u1ee3ng h\u00f3a ho\u00e0n to\u00e0n c\u00f4ng ngh\u1ec7 xem. B\u1ea1n c\u00f3 th\u1ec3 t\u00edch h\u1ee3p tr\u1ef1c ti\u1ebfp v\u1edbi c\u00e1c c\u00f4ng ngh\u1ec7 k\u1ebft xu\u1ea5t d\u1ef1a tr\u00ean m\u1eabu nh\u01b0 JSP, Velocity v\u00e0 Freemarker ho\u1eb7c tr\u1ef1c ti\u1ebfp t\u1ea1o XML, JSON, Atom v\u00e0 nhi\u1ec1u lo\u1ea1i n\u1ed9i dung kh\u00e1c. B\u1ea3n \u0111\u1ed3 m\u00f4 h\u00ecnh \u0111\u01a1n gi\u1ea3n \u0111\u01b0\u1ee3c chuy\u1ec3n th\u00e0nh m\u1ed9t \u0111\u1ecbnh d\u1ea1ng ph\u00f9 h\u1ee3p, ch\u1eb3ng h\u1ea1n nh\u01b0 c\u00e1c thu\u1ed9c t\u00ednh y\u00eau c\u1ea7u JSP, m\u1ed9t m\u00f4 h\u00ecnh m\u1eabu V\u1eadn t\u1ed1c.\n\nSpring Boot\n\nSpring Boot l\u00e0 m\u1ed9t b\u1ed9 khung d\u1ef1a tr\u00ean Java m\u00e3 ngu\u1ed3n m\u1edf \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 t\u1ea1o m\u1ed9t D\u1ecbch v\u1ee5 vi m\u00f4. N\u00f3 \u0111\u01b0\u1ee3c ph\u00e1t tri\u1ec3n b\u1edfi Pivotal Team v\u00e0 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 x\u00e2y d\u1ef1ng c\u00e1c \u1ee9ng d\u1ee5ng Spring s\u1eb5n s\u00e0ng s\u1ea3n xu\u1ea5t v\u00e0 \u0111\u1ed9c l\u1eadp. Ch\u01b0\u01a1ng n\u00e0y s\u1ebd gi\u1edbi thi\u1ec7u v\u1ec1 Spring Boot v\u00e0 gi\u00fap b\u1ea1n l\u00e0m quen v\u1edbi c\u00e1c kh\u00e1i ni\u1ec7m c\u01a1 b\u1ea3n c\u1ee7a n\u00f3.\n\n- Thu\u1eadn l\u1ee3i:\n\nTri\u1ec3n khai d\u1ec5 d\u00e0ng\n\nKh\u1ea3 n\u0103ng m\u1edf r\u1ed9ng \u0111\u01a1n gi\u1ea3n\n\nT\u01b0\u01a1ng th\u00edch v\u1edbi Container"}


created_at: 2024-07-14 06:13:49
topic: persistent://default/default/a732dde4-2aa8-4bbc-b876-b96d276bd6e7
id: 62770d13-2520-4553-83d1-b1993e01516c
encoding: FLOAT32
metadata:
{"source": "./user_file/vonhuy777@gmail.com/DEMO1.docx", "chroma:document": "Spring c\u00f3 nhi\u1ec1u c\u00f4ng c\u1ee5 c\u1ef1c k\u1ef3 linh ho\u1ea1t. B\u1ed9 \u0111i\u1ec1u khi\u1ec3n th\u01b0\u1eddng ch\u1ecbu tr\u00e1ch nhi\u1ec7m chu\u1ea9n b\u1ecb B\u1ea3n \u0111\u1ed3 m\u00f4 h\u00ecnh v\u1edbi d\u1eef li\u1ec7u v\u00e0 ch\u1ecdn t\u00ean ch\u1ebf \u0111\u1ed9 xem nh\u01b0ng n\u00f3 c\u0169ng c\u00f3 th\u1ec3 ghi tr\u1ef1c ti\u1ebfp v\u00e0o lu\u1ed3ng ph\u1ea3n h\u1ed3i v\u00e0 ho\u00e0n th\u00e0nh y\u00eau c\u1ea7u. \u0110\u1ed9 ph\u00e2n gi\u1ea3i t\u00ean c\u1ee7a ch\u1ebf \u0111\u1ed9 xem c\u00f3 th\u1ec3 \u0111\u1ecbnh c\u1ea5u h\u00ecnh cao th\u00f4ng qua ph\u1ea7n m\u1edf r\u1ed9ng t\u1ec7p ho\u1eb7c Ch\u1ea5p nh\u1eadn th\u01b0\u01a1ng l\u01b0\u1ee3ng lo\u1ea1i n\u1ed9i dung ti\u00eau \u0111\u1ec1, th\u00f4ng qua t\u00ean bean, t\u1ec7p thu\u1ed9c t\u00ednh ho\u1eb7c th\u1eadm ch\u00ed tri\u1ec3n khai ViewResolver t\u00f9y ch\u1ec9nh. M\u00f4 h\u00ecnh (M trong MVC) l\u00e0 giao di\u1ec7n B\u1ea3n \u0111\u1ed3, cho ph\u00e9p tr\u1eebu t\u01b0\u1ee3ng h\u00f3a ho\u00e0n to\u00e0n c\u00f4ng ngh\u1ec7 xem. B\u1ea1n c\u00f3 th\u1ec3 t\u00edch h\u1ee3p tr\u1ef1c ti\u1ebfp v\u1edbi c\u00e1c c\u00f4ng ngh\u1ec7 k\u1ebft xu\u1ea5t d\u1ef1a tr\u00ean m\u1eabu nh\u01b0 JSP, Velocity v\u00e0 Freemarker ho\u1eb7c tr\u1ef1c ti\u1ebfp t\u1ea1o XML, JSON, Atom v\u00e0 nhi\u1ec1u lo\u1ea1i n\u1ed9i dung kh\u00e1c. B\u1ea3n \u0111\u1ed3 m\u00f4 h\u00ecnh \u0111\u01a1n gi\u1ea3n \u0111\u01b0\u1ee3c chuy\u1ec3n th\u00e0nh m\u1ed9t \u0111\u1ecbnh d\u1ea1ng ph\u00f9 h\u1ee3p, ch\u1eb3ng h\u1ea1n nh\u01b0 c\u00e1c thu\u1ed9c t\u00ednh y\u00eau c\u1ea7u JSP, m\u1ed9t m\u00f4 h\u00ecnh m\u1eabu V\u1eadn t\u1ed1c.\n\nSpring Boot\n\nSpring Boot l\u00e0 m\u1ed9t b\u1ed9 khung d\u1ef1a tr\u00ean Java m\u00e3 ngu\u1ed3n m\u1edf \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 t\u1ea1o m\u1ed9t D\u1ecbch v\u1ee5 vi m\u00f4. N\u00f3 \u0111\u01b0\u1ee3c ph\u00e1t tri\u1ec3n b\u1edfi Pivotal Team v\u00e0 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 x\u00e2y d\u1ef1ng c\u00e1c \u1ee9ng d\u1ee5ng Spring s\u1eb5n s\u00e0ng s\u1ea3n xu\u1ea5t v\u00e0 \u0111\u1ed9c l\u1eadp. Ch\u01b0\u01a1ng n\u00e0y s\u1ebd gi\u1edbi thi\u1ec7u v\u1ec1 Spring Boot v\u00e0 gi\u00fap b\u1ea1n l\u00e0m quen v\u1edbi c\u00e1c kh\u00e1i ni\u1ec7m c\u01a1 b\u1ea3n c\u1ee7a n\u00f3.\n\n- Thu\u1eadn l\u1ee3i:\n\nTri\u1ec3n khai d\u1ec5 d\u00e0ng\n\nKh\u1ea3 n\u0103ng m\u1edf r\u1ed9ng \u0111\u01a1n gi\u1ea3n\n\nT\u01b0\u01a1ng th\u00edch v\u1edbi Container\n\nC\u1ea5u h\u00ecnh t\u1ed1i thi\u1ec3u\n\nTh\u1eddi gian x\u00e2y d\u1ef1ng th\u1ea5p.\n\nSpring JPA\n\nSpring Data JPA, m\u1ed9t ph\u1ea7n c\u1ee7a h\u1ecd Spring Data l\u1edbn h\u01a1n, gi\u00fap d\u1ec5 d\u00e0ng tri\u1ec3n khai c\u00e1c kho l\u01b0u tr\u1eef d\u1ef1a tr\u00ean JPA. M\u00f4-\u0111un n\u00e0y li\u00ean quan \u0111\u1ebfn h\u1ed7 tr\u1ee3 n\u00e2ng cao cho c\u00e1c l\u1edbp truy c\u1eadp d\u1eef li\u1ec7u d\u1ef1a tr\u00ean JPA. N\u00f3 gi\u00fap vi\u1ec7c x\u00e2y d\u1ef1ng c\u00e1c \u1ee9ng d\u1ee5ng d\u1ef1a tr\u00ean Spring s\u1eed d\u1ee5ng c\u00e1c c\u00f4ng ngh\u1ec7 truy c\u1eadp d\u1eef li\u1ec7u tr\u1edf n\u00ean d\u1ec5 d\u00e0ng h\u01a1n.\n\nVi\u1ec7c tri\u1ec3n khai l\u1edbp truy c\u1eadp d\u1eef li\u1ec7u c\u1ee7a m\u1ed9t \u1ee9ng d\u1ee5ng \u0111\u00e3 kh\u00e1 c\u1ed3ng k\u1ec1nh trong m\u1ed9t th\u1eddi gian d\u00e0i. Qu\u00e1 nhi\u1ec1u m\u00e3 so\u1ea1n s\u1eb5n ph\u1ea3i \u0111\u01b0\u1ee3c vi\u1ebft \u0111\u1ec3 th\u1ef1c hi\u1ec7n c\u00e1c truy v\u1ea5n \u0111\u01a1n gi\u1ea3n c\u0169ng nh\u01b0 th\u1ef1c hi\u1ec7n ph\u00e2n trang v\u00e0 ki\u1ec3m tra. Spring Data JPA nh\u1eb1m m\u1ee5c \u0111\u00edch c\u1ea3i thi\u1ec7n \u0111\u00e1ng k\u1ec3 vi\u1ec7c tri\u1ec3n khai c\u00e1c l\u1edbp truy c\u1eadp d\u1eef li\u1ec7u b\u1eb1ng c\u00e1ch gi\u1ea3m n\u1ed7 l\u1ef1c xu\u1ed1ng m\u1ee9c th\u1ef1c s\u1ef1 c\u1ea7n thi\u1ebft. V\u1edbi t\u01b0 c\u00e1ch l\u00e0 nh\u00e0 ph\u00e1t tri\u1ec3n, b\u1ea1n vi\u1ebft c\u00e1c giao di\u1ec7n kho l\u01b0u tr\u1eef c\u1ee7a m\u00ecnh, bao g\u1ed3m c\u00e1c ph\u01b0\u01a1ng th\u1ee9c t\u00ecm ki\u1ebfm t\u00f9y ch\u1ec9nh v\u00e0 Spring s\u1ebd t\u1ef1 \u0111\u1ed9ng cung c\u1ea5p tri\u1ec3n khai.\n\n- C\u00e1c \u0111\u1eb7c tr\u01b0ng c\u1ee7a JPA:\n\nH\u1ed7 tr\u1ee3 tinh vi \u0111\u1ec3 x\u00e2y d\u1ef1ng kho l\u01b0u tr\u1eef d\u1ef1a tr\u00ean Spring v\u00e0 JPA\n\nKi\u1ec3m to\u00e1n minh b\u1ea1ch c\u1ee7a l\u1edbp mi\u1ec1n\n\nH\u1ed7 tr\u1ee3 ph\u00e2n trang, th\u1ef1c thi truy v\u1ea5n \u0111\u1ed9ng, kh\u1ea3 n\u0103ng t\u00edch h\u1ee3p m\u00e3 truy c\u1eadp d\u1eef li\u1ec7u t\u00f9y ch\u1ec9nh\n\nX\u00e1c th\u1ef1c c\u00e1c truy v\u1ea5n c\u00f3 ch\u00fa th\u00edch @Query t\u1ea1i th\u1eddi \u0111i\u1ec3m kh\u1edfi \u0111\u1ed9ng\n\nH\u1ed7 tr\u1ee3 \u00e1nh x\u1ea1 th\u1ef1c th\u1ec3 d\u1ef1a tr\u00ean XML\n\nC\u1ea5u h\u00ecnh kho l\u01b0u tr\u1eef d\u1ef1a tr\u00ean JavaConfig b\u1eb1ng c\u00e1ch gi\u1edbi thi\u1ec7u @EnableJpaRepositories.\n\nSpring Security\n\nSpring Security l\u00e0 m\u1ed9t khung c\u1ee7a h\u1ec7 th\u1ed1ng Spring, d\u00e0nh ri\u00eang cho vi\u1ec7c thi\u1ebft l\u1eadp b\u1ea3o m\u1eadt \u1ee9ng d\u1ee5ng bao g\u1ed3m x\u00e1c th\u1ef1c v\u00e0 \u1ee7y quy\u1ec1n.\n\n- Trong \u0111\u00f3 c\u00f3 2 lo\u1ea1i:\n\nX\u00e1c th\u1ef1c (Authentication): l\u00e0 c\u00e1ch ch\u00fang t\u00f4i x\u00e1c minh danh t\u00ednh c\u1ee7a ng\u01b0\u1eddi \u0111ang c\u1ed1 truy c\u1eadp v\u00e0o m\u1ed9t t\u00e0i nguy\u00ean c\u1ee5 th\u1ec3.\n\n\u1ee6y quy\u1ec1n (Authorization): l\u00e0 x\u00e1c \u0111\u1ecbnh ai \u0111\u01b0\u1ee3c ph\u00e9p truy c\u1eadp v\u00e0o m\u1ed9t t\u00e0i nguy\u00ean c\u1ee5 th\u1ec3.\n\nJWT\n\nJWT l\u00e0 m\u1ed9t chu\u1ed7i gi\u00e1 tr\u1ecb \u0111\u01b0\u1ee3c m\u00e3 h\u00f3a d\u01b0\u1edbi d\u1ea1ng Base64url, bao g\u1ed3m 3 ph\u1ea7n ch\u00ednh: Header, Payload v\u00e0 Signature.\n\n- Trong d\u00f3:\n\nHeader: ch\u1ee9a 2 th\u00f4ng tin ch\u00ednh l\u00e0 lo\u1ea1i token (JWT) v\u00e0 thu\u1eadt to\u00e1n s\u1eed d\u1ee5ng, th\u01b0\u1eddng l\u00e0 HS256, SHA256 ho\u1eb7c RSA."}


created_at: 2024-07-14 06:13:49
topic: persistent://default/default/a732dde4-2aa8-4bbc-b876-b96d276bd6e7
id: 266ce038-bfaf-4dee-8445-e88b8134f0f5
encoding: FLOAT32
metadata:
{"source": "./user_file/vonhuy777@gmail.com/DEMO1.docx", "chroma:document": "- C\u00e1c \u0111\u1eb7c tr\u01b0ng c\u1ee7a JPA:\n\nH\u1ed7 tr\u1ee3 tinh vi \u0111\u1ec3 x\u00e2y d\u1ef1ng kho l\u01b0u tr\u1eef d\u1ef1a tr\u00ean Spring v\u00e0 JPA\n\nKi\u1ec3m to\u00e1n minh b\u1ea1ch c\u1ee7a l\u1edbp mi\u1ec1n\n\nH\u1ed7 tr\u1ee3 ph\u00e2n trang, th\u1ef1c thi truy v\u1ea5n \u0111\u1ed9ng, kh\u1ea3 n\u0103ng t\u00edch h\u1ee3p m\u00e3 truy c\u1eadp d\u1eef li\u1ec7u t\u00f9y ch\u1ec9nh\n\nX\u00e1c th\u1ef1c c\u00e1c truy v\u1ea5n c\u00f3 ch\u00fa th\u00edch @Query t\u1ea1i th\u1eddi \u0111i\u1ec3m kh\u1edfi \u0111\u1ed9ng\n\nH\u1ed7 tr\u1ee3 \u00e1nh x\u1ea1 th\u1ef1c th\u1ec3 d\u1ef1a tr\u00ean XML\n\nC\u1ea5u h\u00ecnh kho l\u01b0u tr\u1eef d\u1ef1a tr\u00ean JavaConfig b\u1eb1ng c\u00e1ch gi\u1edbi thi\u1ec7u @EnableJpaRepositories.\n\nSpring Security\n\nSpring Security l\u00e0 m\u1ed9t khung c\u1ee7a h\u1ec7 th\u1ed1ng Spring, d\u00e0nh ri\u00eang cho vi\u1ec7c thi\u1ebft l\u1eadp b\u1ea3o m\u1eadt \u1ee9ng d\u1ee5ng bao g\u1ed3m x\u00e1c th\u1ef1c v\u00e0 \u1ee7y quy\u1ec1n.\n\n- Trong \u0111\u00f3 c\u00f3 2 lo\u1ea1i:\n\nX\u00e1c th\u1ef1c (Authentication): l\u00e0 c\u00e1ch ch\u00fang t\u00f4i x\u00e1c minh danh t\u00ednh c\u1ee7a ng\u01b0\u1eddi \u0111ang c\u1ed1 truy c\u1eadp v\u00e0o m\u1ed9t t\u00e0i nguy\u00ean c\u1ee5 th\u1ec3.\n\n\u1ee6y quy\u1ec1n (Authorization): l\u00e0 x\u00e1c \u0111\u1ecbnh ai \u0111\u01b0\u1ee3c ph\u00e9p truy c\u1eadp v\u00e0o m\u1ed9t t\u00e0i nguy\u00ean c\u1ee5 th\u1ec3.\n\nJWT\n\nJWT l\u00e0 m\u1ed9t chu\u1ed7i gi\u00e1 tr\u1ecb \u0111\u01b0\u1ee3c m\u00e3 h\u00f3a d\u01b0\u1edbi d\u1ea1ng Base64url, bao g\u1ed3m 3 ph\u1ea7n ch\u00ednh: Header, Payload v\u00e0 Signature.\n\n- Trong d\u00f3:\n\nHeader: ch\u1ee9a 2 th\u00f4ng tin ch\u00ednh l\u00e0 lo\u1ea1i token (JWT) v\u00e0 thu\u1eadt to\u00e1n s\u1eed d\u1ee5ng, th\u01b0\u1eddng l\u00e0 HS256, SHA256 ho\u1eb7c RSA.\n\nPayload: ch\u1ee9a th\u00f4ng tin ch\u00ednh v\u1ec1 ng\u01b0\u1eddi d\u00f9ng (ho\u1eb7c b\u1ea5t k\u1ef3 th\u00f4ng tin n\u00e0o b\u1ea1n cho l\u00e0 c\u1ea7n thi\u1ebft) v\u00e0 c\u00e1c th\u00f4ng tin kh\u00e1c nh\u01b0 th\u1eddi gian h\u1ebft h\u1ea1n.\n\nSignature: \u0111\u1ec3 t\u1ea1o ch\u1eef k\u00fd c\u1ea7n c\u00f3 ph\u1ea7n header \u0111\u01b0\u1ee3c m\u00e3 h\u00f3a, payload \u0111\u01b0\u1ee3c m\u00e3 h\u00f3a, kh\u00f3a b\u00ed m\u1eadt v\u00e0 thu\u1eadt to\u00e1n \u0111\u00e3 n\u00eau trong ph\u1ea7n Header.\n\nRest Controller\n\nRestController \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 t\u1ea1o c\u00e1c d\u1ecbch v\u1ee5 web t\u0129nh v\u1edbi s\u1ef1 tr\u1ee3 gi\u00fap c\u1ee7a annotation @RestController. Annotaiton n\u00e0y \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u1edf c\u1ea5p l\u1edbp v\u00e0 cho ph\u00e9p l\u1edbp x\u1eed l\u00fd c\u00e1c y\u00eau c\u1ea7u do m\u00e1y kh\u00e1ch \u0111\u01b0a ra. RestController cho ph\u00e9p x\u1eed l\u00fd t\u1ea5t c\u1ea3 c\u00e1c RestAPI nh\u01b0 c\u00e1c y\u00eau c\u1ea7u GET, POST, DELETE, PUT v\u00e0 n\u00f3 \u0111\u01b0\u1ee3c k\u1ebft h\u1ee3p b\u1edfi @Controller v\u00e0 @ResponseBody gi\u00fap cho vi\u1ec7c x\u00e2y d\u1ef1ng c\u00e1c RESTful API \u0111\u01b0\u1ee3c d\u1ec5 d\u00e0ng h\u01a1n, \u0111\u01a1n gi\u1ea3n h\u01a1n.\n\nRest Template\n\nRestTemplate \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 t\u1ea1o c\u00e1c \u1ee9ng d\u1ee5ng s\u1eed d\u1ee5ng D\u1ecbch v\u1ee5 Web RESTful. B\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng ph\u01b0\u01a1ng th\u1ee9c exchange() \u0111\u1ec3 s\u1eed d\u1ee5ng c\u00e1c d\u1ecbch v\u1ee5 web cho t\u1ea5t c\u1ea3 c\u00e1c ph\u01b0\u01a1ng th\u1ee9c HTTP.\n\nCH\u01af\u01a0NG 3: Y\u00caU C\u1ea6U C\u1ee6A D\u1ef0 \u00c1N\n\n- M\u1ee5c ti\u00eau l\u00e0 x\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng cho tuy\u1ec3n d\u1ee5ng g\u1ed3m c\u00e1c ch\u1ee9c n\u0103ng ch\u00ednh:\n\nV\u1edbi RECcer:\n\nQu\u1ea3n l\u00fd th\u00f4ng tin v\u1ecb tr\u00ed tuy\u1ec3n d\u1ee5ng, tuy\u1ec3n sinh.\t\n\nQu\u1ea3n l\u00fd c\u00e1c h\u1ed3 s\u01a1 \u1ee9ng tuy\u1ec3n (candidate), histoty c\u1ee7a c\u00e1c h\u1ed3 s\u01a1 n\u00e0y, blacklist c\u00e1c ki\u1ec3u.\n\nQu\u1ea3n l\u00fd th\u00f4ng tin \u1ee9ng vi\u00ean (l\u00e0 data collect t\u1eeb c\u00e1c ho\u1ea1t \u0111\u1ed9ng ch\u1ee9 kh\u00f4ng ph\u1ea3i ch\u1ec9 t\u1eeb \u1ee9ng vi\u00ean n\u1ed9p CV).\t\n\nSuggestion c\u00e1c h\u1ed3 s\u01a1 ph\u00f9 h\u1ee3p v\u1ecb tr\u00ed \u1ee9ng tuy\u1ec3n d\u1ef1a v\u00e0o k\u1ef9 n\u0103ng c\u1ee7a \u1ee9ng vi\u00ean v\u1edbi c\u00e1c th\u00f4ng tin \u0111ang c\u00f3.\t\n\nQu\u1ea3n l\u00fd th\u00f4ng tin c\u00e1c interviewer ( ng\u01b0\u1eddi c\u00f3 th\u1ec3 h\u1ed7 tr\u1ee3 ph\u1ecfng v\u1ea5n).\t\n\nCh\u1ee9c n\u0103ng h\u1ed7 tr\u1ee3 v\u00e0 theo d\u00f5i tracking c\u00e1c k\u1ebft qu\u1ea3 ph\u1ecfng v\u1ea5n, history \u1ee9ng vi\u00ean qua c\u00e1c l\u1ea7n ph\u1ecfng v\u1ea5n.... \u00a0( t\u1eeb settup MR g\u1edfi PV, l\u01b0u tr\u1eef k\u1ebft qu\u1ea3 PV, ....).\n\nC\u00e1c b\u00e1o c\u00e1o report h\u1ed7 tr\u1ee3 ph\u00e2n t\u00edch.\u00a0\t\t\t\t\t\n\nQu\u1ea3n l\u00fd th\u00f4ng tin tuy\u1ec3n sinh.\t\t\t\t\n\nQu\u1ea3n l\u00fd vi\u1ec7c li\u00ean l\u1ea1c v\u00e0 k\u1ebft qu\u1ea3 v\u1edbi c\u00e1c \u1ee9ng vi\u00ean tuy\u1ec3n sinh\u00a0\n\nQu\u1ea3n l\u00fd th\u00f4ng tin c\u00e1c event v\u00e0 c\u00e1c candidate s\u0103n \u0111\u01b0\u1ee3c t\u1eeb event ho\u1eb7c c\u00e1c ch\u01b0\u01a1ng tr\u00ecnh li\u00ean k\u1ebft.\u00a0\n\nV\u1edbi Candidate ( tham kh\u1ea3o ch\u1ee9c n\u0103ng c\u1ee7a vietnamwork, linkedlin)\n\nC\u00f3 th\u1ec3 xem c\u00e1c v\u1ecb tr\u00ed tuy\u1ec3n d\u1ee5ng.\t\t\t\t\t\t\t\n\nC\u00f3 th\u1ec3 n\u00f4p CV \u1ee9ng tuy\u1ec3n v\u00e0o v\u1ecb tr\u00ed tuy\u1ec3n d\u1ee5ng.\t\t\t\t\n\nC\u00f3 th\u1ec3 t\u1ea1o CV tr\u00ean h\u1ec7 th\u1ed1ng v\u00e0 s\u1eed d\u1ee5ng \u0111\u1ec3 apply v\u00e0o v\u1ecb tr\u00ed tuy\u1ec3n d\u1ee5ng. ==> gi\u1ed1ng nh\u01b0 1 trang profile c\u1ee7a \u1ee9ng vi\u00ean. ( tham kh\u1ea3o linkedin).\n\nV\u1edbt Interviewer\n\nCh\u1ea5m \u0111i\u1ec3m \u1ee9ng vi\u00ean"}


created_at: 2024-07-14 06:13:49
topic: persistent://default/default/a732dde4-2aa8-4bbc-b876-b96d276bd6e7
id: a04e672f-d3f6-4f9e-8633-85aa97e70158
encoding: FLOAT32
metadata:
{"source": "./user_file/vonhuy777@gmail.com/DEMO1.docx", "chroma:document": "Rest Template\n\nRestTemplate \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 t\u1ea1o c\u00e1c \u1ee9ng d\u1ee5ng s\u1eed d\u1ee5ng D\u1ecbch v\u1ee5 Web RESTful. B\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng ph\u01b0\u01a1ng th\u1ee9c exchange() \u0111\u1ec3 s\u1eed d\u1ee5ng c\u00e1c d\u1ecbch v\u1ee5 web cho t\u1ea5t c\u1ea3 c\u00e1c ph\u01b0\u01a1ng th\u1ee9c HTTP.\n\nCH\u01af\u01a0NG 3: Y\u00caU C\u1ea6U C\u1ee6A D\u1ef0 \u00c1N\n\n- M\u1ee5c ti\u00eau l\u00e0 x\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng cho tuy\u1ec3n d\u1ee5ng g\u1ed3m c\u00e1c ch\u1ee9c n\u0103ng ch\u00ednh:\n\nV\u1edbi RECcer:\n\nQu\u1ea3n l\u00fd th\u00f4ng tin v\u1ecb tr\u00ed tuy\u1ec3n d\u1ee5ng, tuy\u1ec3n sinh.\t\n\nQu\u1ea3n l\u00fd c\u00e1c h\u1ed3 s\u01a1 \u1ee9ng tuy\u1ec3n (candidate), histoty c\u1ee7a c\u00e1c h\u1ed3 s\u01a1 n\u00e0y, blacklist c\u00e1c ki\u1ec3u.\n\nQu\u1ea3n l\u00fd th\u00f4ng tin \u1ee9ng vi\u00ean (l\u00e0 data collect t\u1eeb c\u00e1c ho\u1ea1t \u0111\u1ed9ng ch\u1ee9 kh\u00f4ng ph\u1ea3i ch\u1ec9 t\u1eeb \u1ee9ng vi\u00ean n\u1ed9p CV).\t\n\nSuggestion c\u00e1c h\u1ed3 s\u01a1 ph\u00f9 h\u1ee3p v\u1ecb tr\u00ed \u1ee9ng tuy\u1ec3n d\u1ef1a v\u00e0o k\u1ef9 n\u0103ng c\u1ee7a \u1ee9ng vi\u00ean v\u1edbi c\u00e1c th\u00f4ng tin \u0111ang c\u00f3.\t\n\nQu\u1ea3n l\u00fd th\u00f4ng tin c\u00e1c interviewer ( ng\u01b0\u1eddi c\u00f3 th\u1ec3 h\u1ed7 tr\u1ee3 ph\u1ecfng v\u1ea5n).\t\n\nCh\u1ee9c n\u0103ng h\u1ed7 tr\u1ee3 v\u00e0 theo d\u00f5i tracking c\u00e1c k\u1ebft qu\u1ea3 ph\u1ecfng v\u1ea5n, history \u1ee9ng vi\u00ean qua c\u00e1c l\u1ea7n ph\u1ecfng v\u1ea5n.... \u00a0( t\u1eeb settup MR g\u1edfi PV, l\u01b0u tr\u1eef k\u1ebft qu\u1ea3 PV, ....).\n\nC\u00e1c b\u00e1o c\u00e1o report h\u1ed7 tr\u1ee3 ph\u00e2n t\u00edch.\u00a0\t\t\t\t\t\n\nQu\u1ea3n l\u00fd th\u00f4ng tin tuy\u1ec3n sinh.\t\t\t\t\n\nQu\u1ea3n l\u00fd vi\u1ec7c li\u00ean l\u1ea1c v\u00e0 k\u1ebft qu\u1ea3 v\u1edbi c\u00e1c \u1ee9ng vi\u00ean tuy\u1ec3n sinh\u00a0\n\nQu\u1ea3n l\u00fd th\u00f4ng tin c\u00e1c event v\u00e0 c\u00e1c candidate s\u0103n \u0111\u01b0\u1ee3c t\u1eeb event ho\u1eb7c c\u00e1c ch\u01b0\u01a1ng tr\u00ecnh li\u00ean k\u1ebft.\u00a0\n\nV\u1edbi Candidate ( tham kh\u1ea3o ch\u1ee9c n\u0103ng c\u1ee7a vietnamwork, linkedlin)\n\nC\u00f3 th\u1ec3 xem c\u00e1c v\u1ecb tr\u00ed tuy\u1ec3n d\u1ee5ng.\t\t\t\t\t\t\t\n\nC\u00f3 th\u1ec3 n\u00f4p CV \u1ee9ng tuy\u1ec3n v\u00e0o v\u1ecb tr\u00ed tuy\u1ec3n d\u1ee5ng.\t\t\t\t\n\nC\u00f3 th\u1ec3 t\u1ea1o CV tr\u00ean h\u1ec7 th\u1ed1ng v\u00e0 s\u1eed d\u1ee5ng \u0111\u1ec3 apply v\u00e0o v\u1ecb tr\u00ed tuy\u1ec3n d\u1ee5ng. ==> gi\u1ed1ng nh\u01b0 1 trang profile c\u1ee7a \u1ee9ng vi\u00ean. ( tham kh\u1ea3o linkedin).\n\nV\u1edbt Interviewer\n\nCh\u1ea5m \u0111i\u1ec3m \u1ee9ng vi\u00ean\n\nC\u00e1c c\u00e2u h\u1ecfi suggestion cho bu\u1ed5i ph\u1ecfng v\u1ea5n theo t\u1eebng skill, t\u1eebng level.\n\n\u0110\u1ecdc \u0111\u01b0\u1ee3c c\u00e1c CV, c\u00e1c th\u00f4ng tin c\u1ee7a \u1ee9ng vi\u00ean \u0111\u01b0\u1ee3c assigned ph\u1ecfng v\u1ea5n.\n\nH\u1ed7 tr\u1ee3 k\u1ebft n\u1ed1i v\u1edbi c\u00e1c tool ph\u1ecfng v\u1ea5n online nh\u01b0 team, zoom(optional ).\n\nV\u1edbi Admin\n\nTo\u00e0n quy\u1ec1n ki\u1ec3m so\u00e1t h\u1ec7 th\u1ed1ng v\u00e0 qu\u1ea3n l\u00fd ng\u01b0\u1eddi d\u00f9ng.\n\nAdmin c\u00f3 \u0111\u01b0\u1ee3c ph\u1ea7n l\u1edbn c\u00e1c quy\u1ec1n v\u1ec1 CRUD, nh\u01b0ng v\u1eabn s\u1ebd kh\u00f4ng \u0111\u01b0\u1ee3c can thi\u1ec7p tr\u1ef1c ti\u1ebfp v\u00e0o th\u00f4ng tin ng\u01b0\u1eddi d\u00f9ng \u0111\u01b0a l\u00ean nh\u01b0 CV.\n\n\nCH\u01af\u01a0NG 4: QU\u00c1 TR\u00ccNH L\u00c0M VI\u1ec6C C\u1ee6A C\u00c1 NH\u00c2N\n\n- Sau khi \u0111\u1ecbnh h\u01b0\u1edbng \u0111\u01b0\u1ee3c d\u1ef1 \u00e1n Tuy\u1ec3n d\u1ee5ng, em \u0111\u01b0\u1ee3c ph\u00e2n c\u00f4ng v\u1ec1 hi\u1ec7n th\u1ef1c qu\u00e1 tr\u00ecnh x\u00e2y d\u1ef1ng h\u1ed3 s\u01a1 ng\u01b0\u1eddi d\u00f9ng v\u00e0 c\u1eadp nh\u1eadt c\u00e1c th\u00f4ng tin c\u1ee7a ng\u01b0\u1eddi d\u00f9ng nh\u01b0 b\u1eb1ng c\u1ea5p, tr\u00ecnh \u0111\u1ed9 h\u1ecdc v\u1ea5n,\u2026\n\nH\u1ecdc c\u00e1ch s\u1eed d\u1ee5ng Git Lab\n\nGitLab l\u00e0 m\u1ed9t trang web d\u1ef1a tr\u00ean DevOps m\u00e3 ngu\u1ed3n m\u1edf v\u00e0 l\u00e0 m\u1ed9t ph\u1ea7n m\u1ec1m c\u00f3 ch\u1ee9c n\u0103ng v\u00e0 nhi\u1ec7m v\u1ee5 qu\u1ea3n l\u00fd phi\u00ean b\u1ea3n m\u00e3 ngu\u1ed3n, cung c\u1ea5p m\u1ed9t tr\u00ecnh qu\u1ea3n l\u00fd Git-repository. Tr\u00ecnh qu\u1ea3n l\u00fd n\u00e0y c\u00f3 c\u00e1c ti\u1ec7n \u00edch nh\u01b0 wiki, theo d\u00f5i s\u1ef1 c\u1ed1 v\u00e0 t\u00edch h\u1ee3p li\u00ean t\u1ee5c. B\u00ean c\u1ea1nh \u0111\u00f3 l\u00e0 kh\u1ea3 n\u0103ng tri\u1ec3n khai c\u00e1c t\u00ednh n\u0103ng pipeline v\u00e0 s\u1eed d\u1ee5ng license m\u00e3 ngu\u1ed3n m\u1edf \u0111\u01b0\u1ee3c ph\u00e1t tri\u1ec3n b\u1edfi GitLab Inc.\n\nV\u00ec ch\u00fang ta \u0111ang l\u00e0m m\u1ed9t d\u1ef1 \u00e1n g\u1ed3m nhi\u1ec1u th\u00e0nh vi\u00ean n\u00ean ch\u00fang s\u1ef1 d\u1ee5ng git lab \u0111\u1ec3 l\u01b0u project. C\u00f4ng ty c\u0169ng h\u01b0\u1edbng d\u1eabn em s\u1eed d\u1ee5ng c\u00e2u l\u1ec7nh \u0111\u01a1n gi\u1ea3n nh\u01b0 \u201cgit pull\u201d,  \u201cgit push\u201d, \u201cgit checkout \u2013b <branch-name>\u201d, \u2026 \u0111\u1ec3 ph\u1ee5c v\u1ee5 cho vi\u1ec7c l\u01b0u project v\u00e0 qu\u1ea3n l\u00fd c\u00e1c ph\u1ea7n \u0111\u01b0\u1ee3c ph\u00e2n c\u00f4ng c\u1ee7a c\u00e1c b\u1ea1n trong nh\u00f3m.\n\nV\u1ebd ERD\n\n\u0110\u00e2y l\u00e0 b\u01b0\u1edbc quan tr\u1ecdng nh\u1ea5t trong d\u1ef1 \u00e1n v\u00ec ch\u00fang ta ph\u1ea3i h\u00ecnh dung d\u1ef1 \u00e1n c\u1ea7n nh\u1eefng g\u00ec, c\u00e1c b\u1ea3ng,  tr\u01b0\u1eddng d\u1eef li\u1ec7u s\u1ebd \u0111\u1ecbnh ngh\u0129a c\u00e1c th\u00f4ng tin ra sao v\u00e0 s\u1ef1 li\u00ean k\u1ebft gi\u1eefa c\u00e1c b\u1ea3ng d\u1eef li\u1ec7u v\u1edbi nhau di\u1ec5n ra nh\u01b0 th\u1ebf n\u00e0o.\n\nX\u00e2y d\u1ef1ng c\u00e1c th\u1ef1c th\u1ec3 (Entity)\n\n- Nhi\u1ec7m v\u1ee5 c\u1ee7a em l\u00e0m Profile v\u00e0 c\u00e1c t\u00ednh n\u0103ng li\u00ean quan \u0111\u1ebfn Profile ng\u01b0\u1eddi d\u00f9ng.\n\n- D\u1ef1a v\u00e0o ERD \u1edf tr\u00ean ta vi\u1ebft m\u00e3 ngu\u1ed3n model cho Profile \u1ebantity:"}


created_at: 2024-07-14 06:13:49
topic: persistent://default/default/a732dde4-2aa8-4bbc-b876-b96d276bd6e7
id: f817ec4b-95a5-4e1b-b5da-3e15688bc68f
encoding: FLOAT32
metadata:
{"source": "./user_file/vonhuy777@gmail.com/DEMO1.docx", "chroma:document": "Admin c\u00f3 \u0111\u01b0\u1ee3c ph\u1ea7n l\u1edbn c\u00e1c quy\u1ec1n v\u1ec1 CRUD, nh\u01b0ng v\u1eabn s\u1ebd kh\u00f4ng \u0111\u01b0\u1ee3c can thi\u1ec7p tr\u1ef1c ti\u1ebfp v\u00e0o th\u00f4ng tin ng\u01b0\u1eddi d\u00f9ng \u0111\u01b0a l\u00ean nh\u01b0 CV.\n\n\nCH\u01af\u01a0NG 4: QU\u00c1 TR\u00ccNH L\u00c0M VI\u1ec6C C\u1ee6A C\u00c1 NH\u00c2N\n\n- Sau khi \u0111\u1ecbnh h\u01b0\u1edbng \u0111\u01b0\u1ee3c d\u1ef1 \u00e1n Tuy\u1ec3n d\u1ee5ng, em \u0111\u01b0\u1ee3c ph\u00e2n c\u00f4ng v\u1ec1 hi\u1ec7n th\u1ef1c qu\u00e1 tr\u00ecnh x\u00e2y d\u1ef1ng h\u1ed3 s\u01a1 ng\u01b0\u1eddi d\u00f9ng v\u00e0 c\u1eadp nh\u1eadt c\u00e1c th\u00f4ng tin c\u1ee7a ng\u01b0\u1eddi d\u00f9ng nh\u01b0 b\u1eb1ng c\u1ea5p, tr\u00ecnh \u0111\u1ed9 h\u1ecdc v\u1ea5n,\u2026\n\nH\u1ecdc c\u00e1ch s\u1eed d\u1ee5ng Git Lab\n\nGitLab l\u00e0 m\u1ed9t trang web d\u1ef1a tr\u00ean DevOps m\u00e3 ngu\u1ed3n m\u1edf v\u00e0 l\u00e0 m\u1ed9t ph\u1ea7n m\u1ec1m c\u00f3 ch\u1ee9c n\u0103ng v\u00e0 nhi\u1ec7m v\u1ee5 qu\u1ea3n l\u00fd phi\u00ean b\u1ea3n m\u00e3 ngu\u1ed3n, cung c\u1ea5p m\u1ed9t tr\u00ecnh qu\u1ea3n l\u00fd Git-repository. Tr\u00ecnh qu\u1ea3n l\u00fd n\u00e0y c\u00f3 c\u00e1c ti\u1ec7n \u00edch nh\u01b0 wiki, theo d\u00f5i s\u1ef1 c\u1ed1 v\u00e0 t\u00edch h\u1ee3p li\u00ean t\u1ee5c. B\u00ean c\u1ea1nh \u0111\u00f3 l\u00e0 kh\u1ea3 n\u0103ng tri\u1ec3n khai c\u00e1c t\u00ednh n\u0103ng pipeline v\u00e0 s\u1eed d\u1ee5ng license m\u00e3 ngu\u1ed3n m\u1edf \u0111\u01b0\u1ee3c ph\u00e1t tri\u1ec3n b\u1edfi GitLab Inc.\n\nV\u00ec ch\u00fang ta \u0111ang l\u00e0m m\u1ed9t d\u1ef1 \u00e1n g\u1ed3m nhi\u1ec1u th\u00e0nh vi\u00ean n\u00ean ch\u00fang s\u1ef1 d\u1ee5ng git lab \u0111\u1ec3 l\u01b0u project. C\u00f4ng ty c\u0169ng h\u01b0\u1edbng d\u1eabn em s\u1eed d\u1ee5ng c\u00e2u l\u1ec7nh \u0111\u01a1n gi\u1ea3n nh\u01b0 \u201cgit pull\u201d,  \u201cgit push\u201d, \u201cgit checkout \u2013b <branch-name>\u201d, \u2026 \u0111\u1ec3 ph\u1ee5c v\u1ee5 cho vi\u1ec7c l\u01b0u project v\u00e0 qu\u1ea3n l\u00fd c\u00e1c ph\u1ea7n \u0111\u01b0\u1ee3c ph\u00e2n c\u00f4ng c\u1ee7a c\u00e1c b\u1ea1n trong nh\u00f3m.\n\nV\u1ebd ERD\n\n\u0110\u00e2y l\u00e0 b\u01b0\u1edbc quan tr\u1ecdng nh\u1ea5t trong d\u1ef1 \u00e1n v\u00ec ch\u00fang ta ph\u1ea3i h\u00ecnh dung d\u1ef1 \u00e1n c\u1ea7n nh\u1eefng g\u00ec, c\u00e1c b\u1ea3ng,  tr\u01b0\u1eddng d\u1eef li\u1ec7u s\u1ebd \u0111\u1ecbnh ngh\u0129a c\u00e1c th\u00f4ng tin ra sao v\u00e0 s\u1ef1 li\u00ean k\u1ebft gi\u1eefa c\u00e1c b\u1ea3ng d\u1eef li\u1ec7u v\u1edbi nhau di\u1ec5n ra nh\u01b0 th\u1ebf n\u00e0o.\n\nX\u00e2y d\u1ef1ng c\u00e1c th\u1ef1c th\u1ec3 (Entity)\n\n- Nhi\u1ec7m v\u1ee5 c\u1ee7a em l\u00e0m Profile v\u00e0 c\u00e1c t\u00ednh n\u0103ng li\u00ean quan \u0111\u1ebfn Profile ng\u01b0\u1eddi d\u00f9ng.\n\n- D\u1ef1a v\u00e0o ERD \u1edf tr\u00ean ta vi\u1ebft m\u00e3 ngu\u1ed3n model cho Profile \u1ebantity:\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@Entity\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@Table(name = \"profile\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@NoArgsConstructor\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@AllArgsConstructor\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@Getter\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@Setter\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@Builder\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpublic class Profile implements Serializable {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Id\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @GeneratedValue(strategy = GenerationType.IDENTITY)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private Long id;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Column(name = \"first_name\", nullable = false)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private String firstName;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Column(name = \"last_name\", nullable = false)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private String lastName;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Column(name = \"date_of_birth\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private LocalDate dob;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Column(name = \"contact_number\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private String contactNumber;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Column(name = \"image_url\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private String userImageURL;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @CreationTimestamp\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private LocalDateTime createdDate;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @UpdateTimestamp\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private LocalDateTime updatedDate;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private boolean enabled = true;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private String street;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private String district;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private String city;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Enumerated(EnumType.STRING)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Column(nullable = false)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private Gender gender;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @ManyToMany(fetch = FetchType.LAZY, targetEntity = CandidateSkill.class)"}


created_at: 2024-07-14 06:13:49
topic: persistent://default/default/a732dde4-2aa8-4bbc-b876-b96d276bd6e7
id: 645c72fd-fc50-48d9-98a3-5e9f0bfc47db
encoding: FLOAT32
metadata:
{"source": "./user_file/vonhuy777@gmail.com/DEMO1.docx", "chroma:document": "public class Profile implements Serializable {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Id\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @GeneratedValue(strategy = GenerationType.IDENTITY)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private Long id;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Column(name = \"first_name\", nullable = false)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private String firstName;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Column(name = \"last_name\", nullable = false)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private String lastName;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Column(name = \"date_of_birth\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private LocalDate dob;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Column(name = \"contact_number\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private String contactNumber;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Column(name = \"image_url\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private String userImageURL;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @CreationTimestamp\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private LocalDateTime createdDate;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @UpdateTimestamp\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private LocalDateTime updatedDate;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private boolean enabled = true;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private String street;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private String district;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private String city;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Enumerated(EnumType.STRING)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Column(nullable = false)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private Gender gender;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @ManyToMany(fetch = FetchType.LAZY, targetEntity = CandidateSkill.class)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @JoinTable(\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        name = \"profile_skill\",\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        joinColumns = @JoinColumn(name = \"profile_id\"),\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        inverseJoinColumns = @JoinColumn(name = \"candidate_skill_id\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    )\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private List<CandidateSkill> candidateSkills;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @ManyToMany(fetch = FetchType.LAZY, targetEntity = EducationDetail.class)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @JoinTable(\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        name = \"profile_education\",\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        joinColumns = @JoinColumn(name = \"profile_id\"),\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        inverseJoinColumns = @JoinColumn(name = \"education_detail_id\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    )\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private List<EducationDetail> educationDetails;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @ManyToMany(fetch = FetchType.LAZY, targetEntity = ExperienceDetail.class)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @JoinTable(\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        name = \"profile_experience_detail\",\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        joinColumns = @JoinColumn(name = \"profile_id\"),\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        inverseJoinColumns = @JoinColumn(name = \"experience_detail_id\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    )\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private List<ExperienceDetail> experienceDetails;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @OneToMany(fetch = FetchType.LAZY, targetEntity = Resume.class)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @JoinTable(\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        name = \"profile_resume\",\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        joinColumns = @JoinColumn(name = \"profile_id\"),\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        inverseJoinColumns = @JoinColumn(name = \"resume_id\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    )\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private List<Resume> resumes;"}


created_at: 2024-07-14 06:13:49
topic: persistent://default/default/a732dde4-2aa8-4bbc-b876-b96d276bd6e7
id: 3eabddaa-f8a2-44f9-b860-b1f9a1baefdf
encoding: FLOAT32
metadata:
{"source": "./user_file/vonhuy777@gmail.com/DEMO1.docx", "chroma:document": ")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private List<CandidateSkill> candidateSkills;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @ManyToMany(fetch = FetchType.LAZY, targetEntity = EducationDetail.class)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @JoinTable(\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        name = \"profile_education\",\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        joinColumns = @JoinColumn(name = \"profile_id\"),\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        inverseJoinColumns = @JoinColumn(name = \"education_detail_id\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    )\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private List<EducationDetail> educationDetails;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @ManyToMany(fetch = FetchType.LAZY, targetEntity = ExperienceDetail.class)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @JoinTable(\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        name = \"profile_experience_detail\",\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        joinColumns = @JoinColumn(name = \"profile_id\"),\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        inverseJoinColumns = @JoinColumn(name = \"experience_detail_id\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    )\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private List<ExperienceDetail> experienceDetails;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @OneToMany(fetch = FetchType.LAZY, targetEntity = Resume.class)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @JoinTable(\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        name = \"profile_resume\",\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        joinColumns = @JoinColumn(name = \"profile_id\"),\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        inverseJoinColumns = @JoinColumn(name = \"resume_id\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    )\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private List<Resume> resumes;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Override\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public int hashCode() {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return Objects.hash(id, firstName, lastName, dob, contactNumber, userImageURL, createdDate, updatedDate,\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            enabled, street, district, city, gender, candidateSkills, educationDetails, experienceDetails, resumes);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public String toString() {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return \"Profile{ \" +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \"id=\" + id +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", firstName=\" + firstName +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", lastName=\" + lastName +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", dob=\" + dob +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", contactNumber=\" + contactNumber +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", userImageURL=\" + userImageURL +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", createdDate=\" + createdDate +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", updatedDate=\" + updatedDate +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", enabled=\" + enabled +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", street=\" + street +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", district=\" + district +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", city=\" + city +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", gender=\" + gender +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", candidateSkills=\" + candidateSkills +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", educationDetails=\" + educationDetails +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", experienceDetails=\" + experienceDetails +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", resumes=\" + resumes +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \"}\";\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n X\u00e2y d\u1ef1ng Repository\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\timport org.springframework.data.jpa.repository.JpaRepository;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\timport org.springframework.stereotype.Repository;"}


created_at: 2024-07-14 06:13:49
topic: persistent://default/default/a732dde4-2aa8-4bbc-b876-b96d276bd6e7
id: ff249460-3243-4b1f-a567-d6b45d7ecc70
encoding: FLOAT32
metadata:
{"source": "./user_file/vonhuy777@gmail.com/DEMO1.docx", "chroma:document": "}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public String toString() {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return \"Profile{ \" +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \"id=\" + id +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", firstName=\" + firstName +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", lastName=\" + lastName +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", dob=\" + dob +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", contactNumber=\" + contactNumber +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", userImageURL=\" + userImageURL +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", createdDate=\" + createdDate +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", updatedDate=\" + updatedDate +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", enabled=\" + enabled +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", street=\" + street +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", district=\" + district +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", city=\" + city +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", gender=\" + gender +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", candidateSkills=\" + candidateSkills +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", educationDetails=\" + educationDetails +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", experienceDetails=\" + experienceDetails +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \", resumes=\" + resumes +\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            \"}\";\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n X\u00e2y d\u1ef1ng Repository\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\timport org.springframework.data.jpa.repository.JpaRepository;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\timport org.springframework.stereotype.Repository;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@Repository\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpublic interface ProfileRepository extends JpaRepository<Profile, Long> {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n X\u00e2y d\u1ef1ng Service v\u00e0 ServiceImpl\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\timport java.util.List;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\timport org.springframework.web.multipart.MultipartFile;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpublic interface ProfileService {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    ResponseTemplate<ProfileDto> getProfileById(Long id);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    List<ProfileDto> getAllProfiles();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    ResponseTemplate<ProfileDto> createProfile(ProfileDto profileDto);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    ResponseTemplate<ProfileDto> updateProfile(Long id, ProfileDto profileDto);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    boolean deleteProfile(Long id);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@Primary\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@Service\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@RequiredArgsConstructor\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpublic class ProfileServiceImpl implements ProfileService {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private final ProfileRepository profileRepository;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private final ProfileMapper profileMapper;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Override\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public ResponseTemplate<ProfileDto> getProfileById(Long id) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        Profile profile = profileRepository\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .findById(id)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .orElseThrow(() -> new ResourceNotFoundException(String.format(\"Unknown id %s\", id)));\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        ProfileDto profileToDto = profileMapper.toProfileDto(profile);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return ResponseTemplate.<ProfileDto>builder()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .code(HttpStatus.CREATED.value())\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .data(profileToDto)"}


created_at: 2024-07-14 06:13:49
topic: persistent://default/default/a732dde4-2aa8-4bbc-b876-b96d276bd6e7
id: f2566b6f-81bc-4fd0-ac63-c246b462504b
encoding: FLOAT32
metadata:
{"source": "./user_file/vonhuy777@gmail.com/DEMO1.docx", "chroma:document": "public interface ProfileService {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    ResponseTemplate<ProfileDto> getProfileById(Long id);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    List<ProfileDto> getAllProfiles();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    ResponseTemplate<ProfileDto> createProfile(ProfileDto profileDto);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    ResponseTemplate<ProfileDto> updateProfile(Long id, ProfileDto profileDto);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    boolean deleteProfile(Long id);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@Primary\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@Service\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@RequiredArgsConstructor\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpublic class ProfileServiceImpl implements ProfileService {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private final ProfileRepository profileRepository;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    private final ProfileMapper profileMapper;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Override\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public ResponseTemplate<ProfileDto> getProfileById(Long id) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        Profile profile = profileRepository\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .findById(id)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .orElseThrow(() -> new ResourceNotFoundException(String.format(\"Unknown id %s\", id)));\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        ProfileDto profileToDto = profileMapper.toProfileDto(profile);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return ResponseTemplate.<ProfileDto>builder()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .code(HttpStatus.CREATED.value())\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .data(profileToDto)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .build();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Override\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public List<ProfileDto> getAllProfiles() {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        List<Profile> profiles = new ArrayList<>();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        profiles.addAll(profileRepository.findAll());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return profileMapper.toProfileDtoList(profiles);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Override\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public ResponseTemplate<ProfileDto> createProfile(ProfileDto profileDto) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        Profile profile = profileMapper.toProfileEntity(profileDto);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        profile.setFirstName(profileDto.getFirstName());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        profile.setLastName(profileDto.getLastName());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        profile.setDob(profileDto.getDob());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        profile.setGender(Gender.valueOf(profileDto.getGender()));\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        profile.setContactNumber(profileDto.getPhoneNumber());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        profile.setUserImageURL(profileDto.getAvatarImageUrl());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        Profile savedProfile = profileRepository.save(profile);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        ProfileDto profileToDto = profileMapper.toProfileDto(savedProfile);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return ResponseTemplate.<ProfileDto>builder()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .code(HttpStatus.CREATED.value())\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .messages(\"Profile created successfully\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .data(profileToDto)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .build();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }"}


created_at: 2024-07-14 06:13:49
topic: persistent://default/default/a732dde4-2aa8-4bbc-b876-b96d276bd6e7
id: dbad43e3-1bc9-4c8b-b2fd-76c3c3713997
encoding: FLOAT32
metadata:
{"source": "./user_file/vonhuy777@gmail.com/DEMO1.docx", "chroma:document": "List<Profile> profiles = new ArrayList<>();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        profiles.addAll(profileRepository.findAll());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return profileMapper.toProfileDtoList(profiles);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Override\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public ResponseTemplate<ProfileDto> createProfile(ProfileDto profileDto) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        Profile profile = profileMapper.toProfileEntity(profileDto);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        profile.setFirstName(profileDto.getFirstName());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        profile.setLastName(profileDto.getLastName());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        profile.setDob(profileDto.getDob());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        profile.setGender(Gender.valueOf(profileDto.getGender()));\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        profile.setContactNumber(profileDto.getPhoneNumber());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        profile.setUserImageURL(profileDto.getAvatarImageUrl());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        Profile savedProfile = profileRepository.save(profile);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        ProfileDto profileToDto = profileMapper.toProfileDto(savedProfile);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return ResponseTemplate.<ProfileDto>builder()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .code(HttpStatus.CREATED.value())\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .messages(\"Profile created successfully\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .data(profileToDto)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .build();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Override\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public ResponseTemplate<ProfileDto> updateProfile(Long id, ProfileDto profileDto) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        Profile profile = profileRepository\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .findById(id)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .orElseThrow(() -> new ResourceNotFoundException(String.format(\"Unknown id %s\", id)));\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        if (profileDto.getFirstName() != null) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            profile.setFirstName(profileDto.getFirstName());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        if (profileDto.getLastName() != null) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            profile.setLastName(profileDto.getLastName());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        if (profileDto.getDob() != null) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            profile.setDob(profileDto.getDob());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        if (profileDto.getGender() != null) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            profile.setGender(Gender.valueOf(profileDto.getGender()));\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        if (profileDto.getPhoneNumber() != null) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            profile.setContactNumber(profile.getContactNumber());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        if (profileDto.getAvatarImageUrl() != null) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            profile.setUserImageURL(profile.getUserImageURL());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        Profile updatedProfile = profileRepository.save(profile);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return ResponseTemplate.<ProfileDto>builder()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .code(HttpStatus.CREATED.value())"}


created_at: 2024-07-14 06:13:49
topic: persistent://default/default/a732dde4-2aa8-4bbc-b876-b96d276bd6e7
id: 1b5c9fbe-1537-4214-8e40-f085b614b7c8
encoding: FLOAT32
metadata:
{"source": "./user_file/vonhuy777@gmail.com/DEMO1.docx", "chroma:document": ".findById(id)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .orElseThrow(() -> new ResourceNotFoundException(String.format(\"Unknown id %s\", id)));\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        if (profileDto.getFirstName() != null) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            profile.setFirstName(profileDto.getFirstName());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        if (profileDto.getLastName() != null) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            profile.setLastName(profileDto.getLastName());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        if (profileDto.getDob() != null) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            profile.setDob(profileDto.getDob());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        if (profileDto.getGender() != null) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            profile.setGender(Gender.valueOf(profileDto.getGender()));\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        if (profileDto.getPhoneNumber() != null) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            profile.setContactNumber(profile.getContactNumber());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        if (profileDto.getAvatarImageUrl() != null) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            profile.setUserImageURL(profile.getUserImageURL());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        Profile updatedProfile = profileRepository.save(profile);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return ResponseTemplate.<ProfileDto>builder()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .code(HttpStatus.CREATED.value())\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .messages(\"Profile updated successfully\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .data(profileMapper.toProfileDto(updatedProfile))\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .build();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Override\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public boolean deleteProfile(Long id) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        Profile profile = profileRepository\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .findById(id)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .orElseThrow(() -> new ResourceNotFoundException(String.format(\"Unknown id %s\", id)));\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        profileRepository.delete(profile);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return true;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n X\u00e2y d\u1ef1ng Controller\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@RestController\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@RequestMapping(\"/api/v1/profile\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@RequiredArgsConstructor\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpublic class ProfileController {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprivate final ProfileService profileService;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprivate final AccountService accountService;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@Operation(\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        summary = \"Create new profile\",\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        description = \"Use this endpoint to create a new profile\"\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    )\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @ApiResponse(\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        responseCode = \"201\",\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        description = \"Successfully created\"\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    )\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @PostMapping\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public ResponseEntity<ResponseTemplate<ProfileDto>> createProfile(@Valid @RequestBody ProfileDto profileDto) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return ResponseEntity.status(HttpStatus.CREATED)"}


created_at: 2024-07-14 06:13:49
topic: persistent://default/default/a732dde4-2aa8-4bbc-b876-b96d276bd6e7
id: e8aa5bf3-dbb0-48aa-b8d8-4f11dbcf60c3
encoding: FLOAT32
metadata:
{"source": "./user_file/vonhuy777@gmail.com/DEMO1.docx", "chroma:document": "}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @Override\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public boolean deleteProfile(Long id) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        Profile profile = profileRepository\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .findById(id)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .orElseThrow(() -> new ResourceNotFoundException(String.format(\"Unknown id %s\", id)));\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        profileRepository.delete(profile);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return true;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n X\u00e2y d\u1ef1ng Controller\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@RestController\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@RequestMapping(\"/api/v1/profile\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@RequiredArgsConstructor\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpublic class ProfileController {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprivate final ProfileService profileService;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprivate final AccountService accountService;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@Operation(\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        summary = \"Create new profile\",\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        description = \"Use this endpoint to create a new profile\"\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    )\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @ApiResponse(\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        responseCode = \"201\",\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        description = \"Successfully created\"\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    )\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @PostMapping\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public ResponseEntity<ResponseTemplate<ProfileDto>> createProfile(@Valid @RequestBody ProfileDto profileDto) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return ResponseEntity.status(HttpStatus.CREATED)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            .body(profileService.createProfile(profileDto));\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @GetMapping(\"/{id}\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public ResponseEntity<ResponseTemplate> getProfile(@PathVariable long id) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return ResponseEntity.ok(profileService.getProfileById(id));\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @PutMapping(\"/update/{id}\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public ResponseEntity<ResponseTemplate<ProfileDto>> updateProfile(\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        @PathVariable Long id, @RequestBody ProfileDto profileDto) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        ResponseTemplate<ProfileDto> profile = profileService.updateProfile(id, profileDto);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return ResponseEntity.status(HttpStatus.CREATED).body(profile);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @DeleteMapping(\"/{id}\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public ResponseEntity<String> deleteProfile(@PathVariable Long id) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        boolean isDeleted = profileService.deleteProfile(id);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        if (!isDeleted) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            String errorMessage = \"Profile could not be deleted with id: %s\".formatted(id);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorMessage);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        } else {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            String successMessage = \"Profile is deleted successfully!\";\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            return ResponseEntity.ok(successMessage);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@GetMapping\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public ResponseEntity<List<ProfileDto>> getAllProfile() {"}


created_at: 2024-07-14 06:13:49
topic: persistent://default/default/a732dde4-2aa8-4bbc-b876-b96d276bd6e7
id: c7cf138b-57b1-4ad8-9d87-1fb8f2f554ed
encoding: FLOAT32
metadata:
{"source": "./user_file/vonhuy777@gmail.com/DEMO1.docx", "chroma:document": "return ResponseEntity.ok(profileService.getProfileById(id));\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @PutMapping(\"/update/{id}\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public ResponseEntity<ResponseTemplate<ProfileDto>> updateProfile(\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        @PathVariable Long id, @RequestBody ProfileDto profileDto) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        ResponseTemplate<ProfileDto> profile = profileService.updateProfile(id, profileDto);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return ResponseEntity.status(HttpStatus.CREATED).body(profile);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @DeleteMapping(\"/{id}\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public ResponseEntity<String> deleteProfile(@PathVariable Long id) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        boolean isDeleted = profileService.deleteProfile(id);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        if (!isDeleted) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            String errorMessage = \"Profile could not be deleted with id: %s\".formatted(id);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorMessage);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        } else {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            String successMessage = \"Profile is deleted successfully!\";\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            return ResponseEntity.ok(successMessage);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@GetMapping\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public ResponseEntity<List<ProfileDto>> getAllProfile() {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return ResponseEntity.ok(profileService.getAllProfiles());\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@PatchMapping\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpublic ResponseEntity<ResponseTemplate<ProfileDto>> editProfile(\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@Valid @RequestPart(value = \"data\") ProfileDto profileDto,\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t@RequestPart(required = false, value = \"avatar\") MultipartFile avatarImage,\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tPrincipal principal\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar savedProfile = accountService.editProfile(principal.getName(),\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tDtoUtil.filterNullValue(profileDto), avatarImage);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar result = ResponseTemplate.<ProfileDto>builder()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.code(HttpStatus.OK.value())\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.data(savedProfile)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.messages(\"Updated Successfully\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.build();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn ResponseEntity.ok(result);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @GetMapping(\"/{id}\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public ResponseEntity<ResponseTemplate<ProfileDto>> getProfileById(@PathVariable Long id) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        ProfileDto profileDto = accountService.getProfileById(id);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        if (profileDto == null) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            return ResponseEntity.notFound().build();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        var result = ResponseTemplate.<ProfileDto>builder()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t                .code(HttpStatus.OK.value())\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t                .data(profileDto)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t                .messages(\"Profile retrieved successfully\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t                .build();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return ResponseEntity.ok(result);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}"}


created_at: 2024-07-14 06:13:49
topic: persistent://default/default/a732dde4-2aa8-4bbc-b876-b96d276bd6e7
id: 005e6f94-8044-4ebf-926d-3a38c6dc2b84
encoding: FLOAT32
metadata:
{"source": "./user_file/vonhuy777@gmail.com/DEMO1.docx", "chroma:document": "@RequestPart(required = false, value = \"avatar\") MultipartFile avatarImage,\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tPrincipal principal\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar savedProfile = accountService.editProfile(principal.getName(),\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tDtoUtil.filterNullValue(profileDto), avatarImage);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar result = ResponseTemplate.<ProfileDto>builder()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.code(HttpStatus.OK.value())\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.data(savedProfile)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.messages(\"Updated Successfully\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.build();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn ResponseEntity.ok(result);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    @GetMapping(\"/{id}\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    public ResponseEntity<ResponseTemplate<ProfileDto>> getProfileById(@PathVariable Long id) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        ProfileDto profileDto = accountService.getProfileById(id);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        if (profileDto == null) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t            return ResponseEntity.notFound().build();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        var result = ResponseTemplate.<ProfileDto>builder()\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t                .code(HttpStatus.OK.value())\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t                .data(profileDto)\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t                .messages(\"Profile retrieved successfully\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t                .build();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        return ResponseEntity.ok(result);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    }\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n Merge code, Fix bug v\u00e0 ho\u00e0n thi\u1ec7n project\n\n- Sau khi th\u1ef1c hi\u1ec7n h\u1ebft c\u00e1c b\u01b0\u1edbc, C\u1ea3 nh\u00f3m b\u1eaft \u0111\u1ea7u h\u1ee3p nh\u1ea5t m\u00e3 ngu\u1ed3n(Merge Code), trong qu\u00e1 tr\u00ecnh merge code s\u1ebd xu\u1ea5t hi\u1ec7n conflict -> y\u00eau c\u1ea7u c\u00e1c th\u00e0nh vi\u00ean c\u1ea7n t\u00ecm hi\u1ec3u v\u1ec1 resolve conflict. \n\n- Sau khi merge code, nh\u00f3m s\u1ebd ch\u1ea1y th\u1eed project \u0111\u1ec3 xem tr\u00ecnh t\u1ef1 ho\u1ea1t \u0111\u1ed9ng c\u1ee7a c\u00e1c t\u00ednh n\u0103ng v\u00e0 ph\u00e1t hi\u1ec7n c\u00e1c l\u1ed7i ph\u00e1t sinh, khi \u0111\u00f3 nh\u00f3m s\u1ebd c\u00f9ng s\u1eeda l\u1ed7i.\n\n- Th\u1ea3o lu\u1eadn v\u1edbi Front-End v\u1ec1 c\u00e1c l\u1ed7i g\u1eb7p ph\u1ea3i khi tri\u1ec3n khai c\u01a1 s\u1edf d\u1eef li\u1ec7u(Deploy database) v\u00e0 gi\u1ea3i th\u00edch s\u1ef1 di chuy\u1ec3n c\u1ee7a c\u00e1c lu\u1ed3ng d\u1eef li\u1ec7u khi g\u1ecdi c\u00e1c method GET ho\u1eb7c POST.\n\n- X\u1eed l\u00fd message l\u1ed7i v\u00e0 ph\u1ed1i h\u1ee3p v\u1edbi Front-End \u0111\u1ec3 ki\u1ec3m tra l\u1ed7i x\u1ea3y ra trong c\u00e1c tr\u01b0\u1eddng h\u1ee3p n\u00e0o. \n\n- Ph\u00e2n quy\u1ec1n cho t\u1eebng API.\n\nCH\u01af\u01a0NG 5: T\u1ed4NG K\u1ebeT\n\n- Trong l\u00fac th\u1ef1c t\u1eadp t\u1ea1i FPT-Software, em \u0111\u00e3 ti\u1ebfp thu nhi\u1ec1u ki\u1ebfn th\u1ee9c. Trong \u0111\u00f3:\n\n\u01afu \u0111i\u1ec3m:\n\nTh\u1ea5y v\u00e0 ti\u1ebfp thu th\u00e1i \u0111\u1ed9 khi l\u00e0m vi\u1ec7c tr\u00ean c\u00f4ng ty\n\nC\u00e1c anh ch\u1ecb Mentor v\u00e0 Admin t\u1eadn t\u00ecnh h\u01b0\u1edbng d\u1eabn, gi\u1edbi thi\u1ec7u c\u00f4ng ngh\u1ec7 m\u1edbi, quy tr\u00ecnh l\u00e0m vi\u1ec7c.\n\nC\u00e1c b\u1ea1n trong nh\u00f3m h\u00f2a \u0111\u1ed3ng, \u0111o\u00e0n k\u1ebft.\n\nC\u00f4ng ty c\u00f2n t\u1ed5 ch\u1ee9c nhi\u1ec1u ho\u1ea1t \u0111\u1ed9ng cho sinh vi\u00ean nh\u01b0 Code War, B\u00f3ng \u0111\u00e1 v\u00e0 English Speaking Club.\n\nHo\u00e0n th\u00e0nh Project \u0111\u00fang th\u1eddi h\u1ea1n.\n\nNh\u01b0\u1ee3c \u0111i\u1ec3m:\n\nB\u1ea3n th\u00e2n c\u00f3 ch\u00fat cho\u00e1ng ng\u1ee3p tr\u01b0\u1edbc quy m\u00f4 c\u1ee7a m\u1ed9t d\u1ef1 \u00e1n th\u1ef1c t\u1ebf.\n\nConflict source code kh\u00e1 nhi\u1ec1u v\u00ec s\u1ef1 kh\u00e1c bi\u1ec7t v\u1ec1 g\u00f3c \u0111\u1ed9 ti\u1ebfp c\u1eadn d\u1ef1 \u00e1n.\n\nCh\u01b0a t\u1ed1i \u01b0u s\u1ee9c m\u1ea1nh c\u1ee7a c\u00e1c th\u01b0 vi\u1ec7n c\u1ee7a Java Spring Boot, c\u00e1 nh\u00e2n em s\u1eed d\u1ee5ng m\u00e3 ngu\u1ed3n ti\u00eau chu\u1ea9n trong project c\u00f2n c\u1ee9ng nh\u1eafc."}


created_at: 2024-07-14 06:13:49
topic: persistent://default/default/a732dde4-2aa8-4bbc-b876-b96d276bd6e7
id: 3caa8a96-e995-42d7-ad89-f17c04d7b24a
encoding: FLOAT32
metadata:
{"source": "./user_file/vonhuy777@gmail.com/DEMO1.docx", "chroma:document": "}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n Merge code, Fix bug v\u00e0 ho\u00e0n thi\u1ec7n project\n\n- Sau khi th\u1ef1c hi\u1ec7n h\u1ebft c\u00e1c b\u01b0\u1edbc, C\u1ea3 nh\u00f3m b\u1eaft \u0111\u1ea7u h\u1ee3p nh\u1ea5t m\u00e3 ngu\u1ed3n(Merge Code), trong qu\u00e1 tr\u00ecnh merge code s\u1ebd xu\u1ea5t hi\u1ec7n conflict -> y\u00eau c\u1ea7u c\u00e1c th\u00e0nh vi\u00ean c\u1ea7n t\u00ecm hi\u1ec3u v\u1ec1 resolve conflict. \n\n- Sau khi merge code, nh\u00f3m s\u1ebd ch\u1ea1y th\u1eed project \u0111\u1ec3 xem tr\u00ecnh t\u1ef1 ho\u1ea1t \u0111\u1ed9ng c\u1ee7a c\u00e1c t\u00ednh n\u0103ng v\u00e0 ph\u00e1t hi\u1ec7n c\u00e1c l\u1ed7i ph\u00e1t sinh, khi \u0111\u00f3 nh\u00f3m s\u1ebd c\u00f9ng s\u1eeda l\u1ed7i.\n\n- Th\u1ea3o lu\u1eadn v\u1edbi Front-End v\u1ec1 c\u00e1c l\u1ed7i g\u1eb7p ph\u1ea3i khi tri\u1ec3n khai c\u01a1 s\u1edf d\u1eef li\u1ec7u(Deploy database) v\u00e0 gi\u1ea3i th\u00edch s\u1ef1 di chuy\u1ec3n c\u1ee7a c\u00e1c lu\u1ed3ng d\u1eef li\u1ec7u khi g\u1ecdi c\u00e1c method GET ho\u1eb7c POST.\n\n- X\u1eed l\u00fd message l\u1ed7i v\u00e0 ph\u1ed1i h\u1ee3p v\u1edbi Front-End \u0111\u1ec3 ki\u1ec3m tra l\u1ed7i x\u1ea3y ra trong c\u00e1c tr\u01b0\u1eddng h\u1ee3p n\u00e0o. \n\n- Ph\u00e2n quy\u1ec1n cho t\u1eebng API.\n\nCH\u01af\u01a0NG 5: T\u1ed4NG K\u1ebeT\n\n- Trong l\u00fac th\u1ef1c t\u1eadp t\u1ea1i FPT-Software, em \u0111\u00e3 ti\u1ebfp thu nhi\u1ec1u ki\u1ebfn th\u1ee9c. Trong \u0111\u00f3:\n\n\u01afu \u0111i\u1ec3m:\n\nTh\u1ea5y v\u00e0 ti\u1ebfp thu th\u00e1i \u0111\u1ed9 khi l\u00e0m vi\u1ec7c tr\u00ean c\u00f4ng ty\n\nC\u00e1c anh ch\u1ecb Mentor v\u00e0 Admin t\u1eadn t\u00ecnh h\u01b0\u1edbng d\u1eabn, gi\u1edbi thi\u1ec7u c\u00f4ng ngh\u1ec7 m\u1edbi, quy tr\u00ecnh l\u00e0m vi\u1ec7c.\n\nC\u00e1c b\u1ea1n trong nh\u00f3m h\u00f2a \u0111\u1ed3ng, \u0111o\u00e0n k\u1ebft.\n\nC\u00f4ng ty c\u00f2n t\u1ed5 ch\u1ee9c nhi\u1ec1u ho\u1ea1t \u0111\u1ed9ng cho sinh vi\u00ean nh\u01b0 Code War, B\u00f3ng \u0111\u00e1 v\u00e0 English Speaking Club.\n\nHo\u00e0n th\u00e0nh Project \u0111\u00fang th\u1eddi h\u1ea1n.\n\nNh\u01b0\u1ee3c \u0111i\u1ec3m:\n\nB\u1ea3n th\u00e2n c\u00f3 ch\u00fat cho\u00e1ng ng\u1ee3p tr\u01b0\u1edbc quy m\u00f4 c\u1ee7a m\u1ed9t d\u1ef1 \u00e1n th\u1ef1c t\u1ebf.\n\nConflict source code kh\u00e1 nhi\u1ec1u v\u00ec s\u1ef1 kh\u00e1c bi\u1ec7t v\u1ec1 g\u00f3c \u0111\u1ed9 ti\u1ebfp c\u1eadn d\u1ef1 \u00e1n.\n\nCh\u01b0a t\u1ed1i \u01b0u s\u1ee9c m\u1ea1nh c\u1ee7a c\u00e1c th\u01b0 vi\u1ec7n c\u1ee7a Java Spring Boot, c\u00e1 nh\u00e2n em s\u1eed d\u1ee5ng m\u00e3 ngu\u1ed3n ti\u00eau chu\u1ea9n trong project c\u00f2n c\u1ee9ng nh\u1eafc.\n\nQua 8 tu\u1ea7n l\u00e0m quen v\u1edbi c\u00f4ng vi\u1ec7c, tuy ch\u1ec9 l\u00e0 m\u1ed9t th\u1ef1c t\u1eadp sinh nh\u01b0ng em \u0111\u00e3 c\u00f3 \u0111\u01b0\u1ee3c c\u00e1i nh\u00ecn t\u1ed5ng quan h\u01a1n v\u1ec1 m\u1ea3ng Spring Boot, c\u00f3 c\u01a1 h\u1ed9i \u0111\u1ec3 l\u00e0m quen \u0111\u01b0\u1ee3c ph\u1ea7n m\u1ec1m v\u00e0 c\u00e1c c\u00f4ng c\u1ee5 \u0111i k\u00e8m. C\u00f4ng ty \u0111\u00e3 h\u1ed7 tr\u1ee3 em h\u1ebft m\u00ecnh, c\u1ea3 v\u1ec1 v\u1eadt ch\u1ea5t l\u1eabn tinh th\u1ea7n, t\u1ea1o m\u1ecdi \u0111i\u1ec1u ki\u1ec7n thu\u1eadn l\u1ee3i cho em c\u00f3 th\u1ec3 d\u1ec5 ti\u1ebfp thu v\u00e0 n\u1eafm b\u1eaft ngu\u1ed3n ki\u1ebfn th\u1ee9c m\u1edbi. Sau k\u00ec th\u1ef1c t\u1eadp n\u00e0y, em mong r\u1eb1ng m\u1ecdi ki\u1ebfn th\u1ee9c thu th\u1eadp \u0111\u01b0\u1ee3c s\u1ebd g\u00f3p ph\u1ea7n kh\u00f4ng nh\u1ecf tr\u00ean b\u01b0\u1edbc \u0111\u01b0\u1eddng c\u1ee7a em sau n\u00e0y, trong cu\u1ed9c s\u1ed1ng c\u0169ng nh\u01b0 trong m\u00f4i tr\u01b0\u1eddng l\u00e0m vi\u1ec7c. Em xin c\u1ea3m \u01a1n nh\u00e0 tr\u01b0\u1eddng \u0111\u00e3 t\u1ea1o \u0111i\u1ec1u ki\u1ec7n cho em th\u1ef1c t\u1eadp trong m\u1ed9t c\u00f4ng ty nh\u01b0 FPT n\u00e0y.\n\nTp. H\u1ed3 Ch\u00ed Minh, ng\u00e0y\u2026 th\u00e1ng \u2026 n\u0103m \u2026\u2026.\n\nSinh vi\u00ean b\u00e1o c\u00e1o\n\n(K\u00fd, ghi r\u00f5 h\u1ecd v\u00e0 t\u00ean)\n\nNg\u01b0\u1eddi \u0111\u00e1nh gi\u00e1\n\n(K\u00fd, ghi r\u00f5 h\u1ecd v\u00e0 t\u00ean)\n\nBan l\u00e3nh \u0111\u1ea1o c\u00f4ng ty\n\n(K\u00fd, ghi r\u00f5 h\u1ecd v\u00e0 t\u00ean)\n\n15"}


# embedding_metadata

key: chroma:document
string_value:
ĐẠI HỌC QUỐC GIA TP.HCM

TRƯỜNG ĐẠI HỌC BÁCH KHOA

KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH

BÁO CÁO

THỰC TẬP NGOÀI TRƯỜNG

HỌC KỲ: 3 - NĂM HỌC: 2022-2023

NGÀNH: Kỹ thuật máy tính

CHƯƠNG TRÌNH ĐÀO TẠO: Chính quy

ĐƠN VỊ/ DOANH NGHIỆP NHẬN THỰC TẬP:

Công ty TNHH Phần mềm FPT Hồ Chí Minh.

CÁN BỘ HƯỚNG DẪN CHUYÊN MÔN TRỰC TIẾP CỦA ĐƠN VỊ/ DOANH NGHIỆP:

Nguyễn Tấn Thành (Mentor).

Nguyễn Đoàn Diệp Ngân (Admin).

CÁN BỘ HƯỚNG DẪN/ GIÁM SÁT/ CHẤM ĐIỂM BÁO CÁO CỦA KHOA (CBHD/CBGS/CĐBC):

……………………………………………………………...

SINH VIÊN THỰC HIỆN (SVTH):

HỌ VÀ TÊN: Nguyễn Phước Thịnh – MSSV: 1915317

TP. HỒ CHÍ MINH, NGÀY 10 THÁNG 8 NĂM 2023

ĐẠI HỌC QUỐC GIA TP.HCM

TRƯỜNG ĐẠI HỌC BÁCH KHOA

KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH

BÁO CÁO

THỰC TẬP NGOÀI TRƯỜNG

HỌC KỲ: 3 - NĂM HỌC: 2022-2023

NGÀNH: Kỹ thuật máy tính

CHƯƠNG TRÌNH ĐÀO TẠO: Chính quy

ĐƠN VỊ/ DOANH NGHIỆP NHẬN THỰC TẬP:

Công ty TNHH Phần mềm FPT Hồ Chí Minh.

CÁN BỘ HƯỚNG DẪN CHUYÊN MÔN TRỰC TIẾP CỦA ĐƠN VỊ/ DOANH NGHIỆP:

Nguyễn Tấn Thành (Mentor).

Nguyễn Đoàn Diệp Ngân (Admin).

CÁN BỘ HƯỚNG DẪN/ GIÁM SÁT/ CHẤM ĐIỂM BÁO CÁO CỦA KHOA (CBHD/CBGS/CĐBC):

……………………………………………………………...

SINH VIÊN THỰC HIỆN (SVTH):

HỌ VÀ TÊN: Nguyễn Phước Thịnh – MSSV: 1915317

TP. HỒ CHÍ MINH, NGÀY 10 THÁNG 8 NĂM 2023


MỤC LỤC

	CHƯƠNG 1: GIỚI THIỆU VỀ CÔNG TY FPT-SOFTWARE	3

	CHƯƠNG 2: TỔNG QUAN VỀ SPRING TRONG JAVA	4

		1.	Spring MVC	4

		2.	Spring Boot	4

		3.	Spring JPA	4

		4.	Spring Security	5

		5.	JWT	5

		6.	Rest Controller	5

		7.	Rest Template	6

	CHƯƠNG 3: YÊU CẦU CỦA DỰ ÁN	7

	CHƯƠNG 4: QUÁ TRÌNH LÀM VIỆC CỦA CÁ NHÂN	8

		1.	Học cách sử dụng Git Lab	8

		2.	Vẽ ERD	8

		3.	Xây dựng các thực thể (Entity)	8

		4.	Xây dựng Repository	10

		5.	Xây dựng Service và ServiceImpl	10

		6.	Xây dựng Controller	12

		7.	Merge code, Fix bug và hoàn thiện project	14

	CHƯƠNG 5: TỔNG KẾT	14

CHƯƠNG 1: GIỚI THIỆU VỀ CÔNG TY FPT-SOFTWARE

FPT Software là tên gọi khác của công ty TNHH Phần Mềm FPT với nhiệm vụ chính là gia công phần mềm tại Việt Nam và nước ngoài.

Thành lập từ năm 1988 đến nay với 3 Trụ sở chính FPT Software đặt tại Việt Nam và một số nước trên toàn thế giới như Hoa Kỳ, Nhật Bản, Malaysia, Đức, Úc, Singapore, Malaysia, Thái Lan và Philipines hiện FPT Software đáp ứng nhu cầu gia công phần mềm lớn cho hơn 150 công ty hàng đầu tại 20 quốc gia lớn nhất trên thế giới hiện nay với các hợp đồng lớn có khi đạt cả 1 triệu USD dành cho một số đối tác lớn như Hitachi, NEOPOST, Petronas, Deutsche Bank, và Unilever với hơn 4000 nhân viên trên toàn thế giới.

FPT Software theo đuổi mục tiêu gia công phần mềm để đáp ứng cho nhu cầu phát triển CNTT của các hãng phần mềm trong nước, các công ty lớn trong nước và tham vọng hơn là xuất khẩu phần mềm trên toàn thế giới cho các công ty nước ngoài biết đến tập đoàn FPT, mục đích chính là vươn đến tầm cao mới thông qua công nghệ nhằm nâng cao năng suất lao động.


key: chroma:document
string_value:
2.	Spring Boot	4

		3.	Spring JPA	4

		4.	Spring Security	5

		5.	JWT	5

		6.	Rest Controller	5

		7.	Rest Template	6

	CHƯƠNG 3: YÊU CẦU CỦA DỰ ÁN	7

	CHƯƠNG 4: QUÁ TRÌNH LÀM VIỆC CỦA CÁ NHÂN	8

		1.	Học cách sử dụng Git Lab	8

		2.	Vẽ ERD	8

		3.	Xây dựng các thực thể (Entity)	8

		4.	Xây dựng Repository	10

		5.	Xây dựng Service và ServiceImpl	10

		6.	Xây dựng Controller	12

		7.	Merge code, Fix bug và hoàn thiện project	14

	CHƯƠNG 5: TỔNG KẾT	14

CHƯƠNG 1: GIỚI THIỆU VỀ CÔNG TY FPT-SOFTWARE

FPT Software là tên gọi khác của công ty TNHH Phần Mềm FPT với nhiệm vụ chính là gia công phần mềm tại Việt Nam và nước ngoài.

Thành lập từ năm 1988 đến nay với 3 Trụ sở chính FPT Software đặt tại Việt Nam và một số nước trên toàn thế giới như Hoa Kỳ, Nhật Bản, Malaysia, Đức, Úc, Singapore, Malaysia, Thái Lan và Philipines hiện FPT Software đáp ứng nhu cầu gia công phần mềm lớn cho hơn 150 công ty hàng đầu tại 20 quốc gia lớn nhất trên thế giới hiện nay với các hợp đồng lớn có khi đạt cả 1 triệu USD dành cho một số đối tác lớn như Hitachi, NEOPOST, Petronas, Deutsche Bank, và Unilever với hơn 4000 nhân viên trên toàn thế giới.

FPT Software theo đuổi mục tiêu gia công phần mềm để đáp ứng cho nhu cầu phát triển CNTT của các hãng phần mềm trong nước, các công ty lớn trong nước và tham vọng hơn là xuất khẩu phần mềm trên toàn thế giới cho các công ty nước ngoài biết đến tập đoàn FPT, mục đích chính là vươn đến tầm cao mới thông qua công nghệ nhằm nâng cao năng suất lao động.

Kinh doanh của FPT Software xuất phát từ Công nghệ thông tin và Viễn Thông FPT là cốt lõi để đáp ứng cho khách hàng trên 63 tỉnh thành trên toàn lãnh thổ Việt Nam và mở rộng đến khách hàng toàn cầu. Từ khi được thành lập cho đến nay, FPT Software đã là công ty phần mềm số 1 tại Việt Nam trong lĩnh vực tích hợp hệ thống, phân phối và bán lẻ, dịch vụ Công Nghệ Thông tin, xuất khẩu gia công phần mềm, bán lẻ sản phẩm CNTT.

Ở lĩnh vực Viễn Thông FPT là một trong 3 nhà cung cấp dịch vụ internet cáp quang FPT hàng đầu tại Việt Nam. Về lĩnh vực quảng cáo, FPT là đơn vị quảng cáo trực tuyến số 1 tại Việt Nam thông qua trang báo điện tử VNexpress với hơn 42 triệu lượt truy cập mỗi ngày.


CHƯƠNG 2: TỔNG QUAN VỀ SPRING TRONG JAVA

Spring MVC

Spring Web model-view-controller framework (MVC) được thiết kế xung quanh một DispatcherServlet để gửi các yêu cầu tới các trình xử lý, với ánh xạ trình xử lý có thể định cấu hình, độ phân giải chế độ xem, ngôn ngữ và độ phân giải chủ đề cũng như hỗ trợ tải tệp lên. Trình xử lý mặc định dựa trên các chú thích(annotation) @Controller và @RequestMapping, cung cấp nhiều phương thức xử lý linh hoạt. Với sự ra đời của Spring 3.0, cơ chế @Controller cũng cho phép bạn tạo các trang Web và ứng dụng RESTful, thông qua chú thích @PathVariable và các tính năng khác.


key: chroma:document
string_value:
Kinh doanh của FPT Software xuất phát từ Công nghệ thông tin và Viễn Thông FPT là cốt lõi để đáp ứng cho khách hàng trên 63 tỉnh thành trên toàn lãnh thổ Việt Nam và mở rộng đến khách hàng toàn cầu. Từ khi được thành lập cho đến nay, FPT Software đã là công ty phần mềm số 1 tại Việt Nam trong lĩnh vực tích hợp hệ thống, phân phối và bán lẻ, dịch vụ Công Nghệ Thông tin, xuất khẩu gia công phần mềm, bán lẻ sản phẩm CNTT.

Ở lĩnh vực Viễn Thông FPT là một trong 3 nhà cung cấp dịch vụ internet cáp quang FPT hàng đầu tại Việt Nam. Về lĩnh vực quảng cáo, FPT là đơn vị quảng cáo trực tuyến số 1 tại Việt Nam thông qua trang báo điện tử VNexpress với hơn 42 triệu lượt truy cập mỗi ngày.


CHƯƠNG 2: TỔNG QUAN VỀ SPRING TRONG JAVA

Spring MVC

Spring Web model-view-controller framework (MVC) được thiết kế xung quanh một DispatcherServlet để gửi các yêu cầu tới các trình xử lý, với ánh xạ trình xử lý có thể định cấu hình, độ phân giải chế độ xem, ngôn ngữ và độ phân giải chủ đề cũng như hỗ trợ tải tệp lên. Trình xử lý mặc định dựa trên các chú thích(annotation) @Controller và @RequestMapping, cung cấp nhiều phương thức xử lý linh hoạt. Với sự ra đời của Spring 3.0, cơ chế @Controller cũng cho phép bạn tạo các trang Web và ứng dụng RESTful, thông qua chú thích @PathVariable và các tính năng khác.

Trong Spring Web MVC, bạn có thể sử dụng bất kỳ đối tượng nào làm đối tượng lệnh hoặc đối tượng hỗ trợ biểu mẫu; bạn không cần triển khai giao diện hoặc lớp cơ sở dành riêng cho khung. Liên kết dữ liệu của Spring rất linh hoạt: ví dụ: nó coi các kiểu không khớp là lỗi xác thực mà ứng dụng có thể đánh giá chứ không phải là lỗi hệ thống. Do đó, bạn không cần sao chép các thuộc tính của đối tượng nghiệp vụ của mình dưới dạng các chuỗi đơn giản, chưa được nhập trong các đối tượng biểu mẫu của bạn chỉ để xử lý các lần gửi không hợp lệ hoặc để chuyển đổi các Chuỗi đúng cách. Thay vào đó, tốt hơn là liên kết trực tiếp với các đối tượng kinh doanh của bạn.

Spring có nhiều công cụ cực kỳ linh hoạt. Bộ điều khiển thường chịu trách nhiệm chuẩn bị Bản đồ mô hình với dữ liệu và chọn tên chế độ xem nhưng nó cũng có thể ghi trực tiếp vào luồng phản hồi và hoàn thành yêu cầu. Độ phân giải tên của chế độ xem có thể định cấu hình cao thông qua phần mở rộng tệp hoặc Chấp nhận thương lượng loại nội dung tiêu đề, thông qua tên bean, tệp thuộc tính hoặc thậm chí triển khai ViewResolver tùy chỉnh. Mô hình (M trong MVC) là giao diện Bản đồ, cho phép trừu tượng hóa hoàn toàn công nghệ xem. Bạn có thể tích hợp trực tiếp với các công nghệ kết xuất dựa trên mẫu như JSP, Velocity và Freemarker hoặc trực tiếp tạo XML, JSON, Atom và nhiều loại nội dung khác. Bản đồ mô hình đơn giản được chuyển thành một định dạng phù hợp, chẳng hạn như các thuộc tính yêu cầu JSP, một mô hình mẫu Vận tốc.

Spring Boot

Spring Boot là một bộ khung dựa trên Java mã nguồn mở được sử dụng để tạo một Dịch vụ vi mô. Nó được phát triển bởi Pivotal Team và được sử dụng để xây dựng các ứng dụng Spring sẵn sàng sản xuất và độc lập. Chương này sẽ giới thiệu về Spring Boot và giúp bạn làm quen với các khái niệm cơ bản của nó.

- Thuận lợi:

Triển khai dễ dàng

Khả năng mở rộng đơn giản

Tương thích với Container


key: chroma:document
string_value:
Spring có nhiều công cụ cực kỳ linh hoạt. Bộ điều khiển thường chịu trách nhiệm chuẩn bị Bản đồ mô hình với dữ liệu và chọn tên chế độ xem nhưng nó cũng có thể ghi trực tiếp vào luồng phản hồi và hoàn thành yêu cầu. Độ phân giải tên của chế độ xem có thể định cấu hình cao thông qua phần mở rộng tệp hoặc Chấp nhận thương lượng loại nội dung tiêu đề, thông qua tên bean, tệp thuộc tính hoặc thậm chí triển khai ViewResolver tùy chỉnh. Mô hình (M trong MVC) là giao diện Bản đồ, cho phép trừu tượng hóa hoàn toàn công nghệ xem. Bạn có thể tích hợp trực tiếp với các công nghệ kết xuất dựa trên mẫu như JSP, Velocity và Freemarker hoặc trực tiếp tạo XML, JSON, Atom và nhiều loại nội dung khác. Bản đồ mô hình đơn giản được chuyển thành một định dạng phù hợp, chẳng hạn như các thuộc tính yêu cầu JSP, một mô hình mẫu Vận tốc.

Spring Boot

Spring Boot là một bộ khung dựa trên Java mã nguồn mở được sử dụng để tạo một Dịch vụ vi mô. Nó được phát triển bởi Pivotal Team và được sử dụng để xây dựng các ứng dụng Spring sẵn sàng sản xuất và độc lập. Chương này sẽ giới thiệu về Spring Boot và giúp bạn làm quen với các khái niệm cơ bản của nó.

- Thuận lợi:

Triển khai dễ dàng

Khả năng mở rộng đơn giản

Tương thích với Container

Cấu hình tối thiểu

Thời gian xây dựng thấp.

Spring JPA

Spring Data JPA, một phần của họ Spring Data lớn hơn, giúp dễ dàng triển khai các kho lưu trữ dựa trên JPA. Mô-đun này liên quan đến hỗ trợ nâng cao cho các lớp truy cập dữ liệu dựa trên JPA. Nó giúp việc xây dựng các ứng dụng dựa trên Spring sử dụng các công nghệ truy cập dữ liệu trở nên dễ dàng hơn.

Việc triển khai lớp truy cập dữ liệu của một ứng dụng đã khá cồng kềnh trong một thời gian dài. Quá nhiều mã soạn sẵn phải được viết để thực hiện các truy vấn đơn giản cũng như thực hiện phân trang và kiểm tra. Spring Data JPA nhằm mục đích cải thiện đáng kể việc triển khai các lớp truy cập dữ liệu bằng cách giảm nỗ lực xuống mức thực sự cần thiết. Với tư cách là nhà phát triển, bạn viết các giao diện kho lưu trữ của mình, bao gồm các phương thức tìm kiếm tùy chỉnh và Spring sẽ tự động cung cấp triển khai.

- Các đặc trưng của JPA:

Hỗ trợ tinh vi để xây dựng kho lưu trữ dựa trên Spring và JPA

Kiểm toán minh bạch của lớp miền

Hỗ trợ phân trang, thực thi truy vấn động, khả năng tích hợp mã truy cập dữ liệu tùy chỉnh

Xác thực các truy vấn có chú thích @Query tại thời điểm khởi động

Hỗ trợ ánh xạ thực thể dựa trên XML

Cấu hình kho lưu trữ dựa trên JavaConfig bằng cách giới thiệu @EnableJpaRepositories.

Spring Security

Spring Security là một khung của hệ thống Spring, dành riêng cho việc thiết lập bảo mật ứng dụng bao gồm xác thực và ủy quyền.

- Trong đó có 2 loại:

Xác thực (Authentication): là cách chúng tôi xác minh danh tính của người đang cố truy cập vào một tài nguyên cụ thể.

Ủy quyền (Authorization): là xác định ai được phép truy cập vào một tài nguyên cụ thể.

JWT

JWT là một chuỗi giá trị được mã hóa dưới dạng Base64url, bao gồm 3 phần chính: Header, Payload và Signature.

- Trong dó:

Header: chứa 2 thông tin chính là loại token (JWT) và thuật toán sử dụng, thường là HS256, SHA256 hoặc RSA.


key: chroma:document
string_value:
- Các đặc trưng của JPA:

Hỗ trợ tinh vi để xây dựng kho lưu trữ dựa trên Spring và JPA

Kiểm toán minh bạch của lớp miền

Hỗ trợ phân trang, thực thi truy vấn động, khả năng tích hợp mã truy cập dữ liệu tùy chỉnh

Xác thực các truy vấn có chú thích @Query tại thời điểm khởi động

Hỗ trợ ánh xạ thực thể dựa trên XML

Cấu hình kho lưu trữ dựa trên JavaConfig bằng cách giới thiệu @EnableJpaRepositories.

Spring Security

Spring Security là một khung của hệ thống Spring, dành riêng cho việc thiết lập bảo mật ứng dụng bao gồm xác thực và ủy quyền.

- Trong đó có 2 loại:

Xác thực (Authentication): là cách chúng tôi xác minh danh tính của người đang cố truy cập vào một tài nguyên cụ thể.

Ủy quyền (Authorization): là xác định ai được phép truy cập vào một tài nguyên cụ thể.

JWT

JWT là một chuỗi giá trị được mã hóa dưới dạng Base64url, bao gồm 3 phần chính: Header, Payload và Signature.

- Trong dó:

Header: chứa 2 thông tin chính là loại token (JWT) và thuật toán sử dụng, thường là HS256, SHA256 hoặc RSA.

Payload: chứa thông tin chính về người dùng (hoặc bất kỳ thông tin nào bạn cho là cần thiết) và các thông tin khác như thời gian hết hạn.

Signature: để tạo chữ ký cần có phần header được mã hóa, payload được mã hóa, khóa bí mật và thuật toán đã nêu trong phần Header.

Rest Controller

RestController được sử dụng để tạo các dịch vụ web tĩnh với sự trợ giúp của annotation @RestController. Annotaiton này được sử dụng ở cấp lớp và cho phép lớp xử lý các yêu cầu do máy khách đưa ra. RestController cho phép xử lý tất cả các RestAPI như các yêu cầu GET, POST, DELETE, PUT và nó được kết hợp bởi @Controller và @ResponseBody giúp cho việc xây dựng các RESTful API được dễ dàng hơn, đơn giản hơn.

Rest Template

RestTemplate được sử dụng để tạo các ứng dụng sử dụng Dịch vụ Web RESTful. Bạn có thể sử dụng phương thức exchange() để sử dụng các dịch vụ web cho tất cả các phương thức HTTP.

CHƯƠNG 3: YÊU CẦU CỦA DỰ ÁN

- Mục tiêu là xây dựng hệ thống cho tuyển dụng gồm các chức năng chính:

Với RECcer:

Quản lý thông tin vị trí tuyển dụng, tuyển sinh.	

Quản lý các hồ sơ ứng tuyển (candidate), histoty của các hồ sơ này, blacklist các kiểu.

Quản lý thông tin ứng viên (là data collect từ các hoạt động chứ không phải chỉ từ ứng viên nộp CV).	

Suggestion các hồ sơ phù hợp vị trí ứng tuyển dựa vào kỹ năng của ứng viên với các thông tin đang có.	

Quản lý thông tin các interviewer ( người có thể hỗ trợ phỏng vấn).	

Chức năng hỗ trợ và theo dõi tracking các kết quả phỏng vấn, history ứng viên qua các lần phỏng vấn....  ( từ settup MR gởi PV, lưu trữ kết quả PV, ....).

Các báo cáo report hỗ trợ phân tích. 					

Quản lý thông tin tuyển sinh.				

Quản lý việc liên lạc và kết quả với các ứng viên tuyển sinh 

Quản lý thông tin các event và các candidate săn được từ event hoặc các chương trình liên kết. 

Với Candidate ( tham khảo chức năng của vietnamwork, linkedlin)

Có thể xem các vị trí tuyển dụng.							

Có thể nôp CV ứng tuyển vào vị trí tuyển dụng.				

Có thể tạo CV trên hệ thống và sử dụng để apply vào vị trí tuyển dụng. ==> giống như 1 trang profile của ứng viên. ( tham khảo linkedin).

Vớt Interviewer

Chấm điểm ứng viên


key: chroma:document
string_value:
Rest Template

RestTemplate được sử dụng để tạo các ứng dụng sử dụng Dịch vụ Web RESTful. Bạn có thể sử dụng phương thức exchange() để sử dụng các dịch vụ web cho tất cả các phương thức HTTP.

CHƯƠNG 3: YÊU CẦU CỦA DỰ ÁN

- Mục tiêu là xây dựng hệ thống cho tuyển dụng gồm các chức năng chính:

Với RECcer:

Quản lý thông tin vị trí tuyển dụng, tuyển sinh.	

Quản lý các hồ sơ ứng tuyển (candidate), histoty của các hồ sơ này, blacklist các kiểu.

Quản lý thông tin ứng viên (là data collect từ các hoạt động chứ không phải chỉ từ ứng viên nộp CV).	

Suggestion các hồ sơ phù hợp vị trí ứng tuyển dựa vào kỹ năng của ứng viên với các thông tin đang có.	

Quản lý thông tin các interviewer ( người có thể hỗ trợ phỏng vấn).	

Chức năng hỗ trợ và theo dõi tracking các kết quả phỏng vấn, history ứng viên qua các lần phỏng vấn....  ( từ settup MR gởi PV, lưu trữ kết quả PV, ....).

Các báo cáo report hỗ trợ phân tích. 					

Quản lý thông tin tuyển sinh.				

Quản lý việc liên lạc và kết quả với các ứng viên tuyển sinh 

Quản lý thông tin các event và các candidate săn được từ event hoặc các chương trình liên kết. 

Với Candidate ( tham khảo chức năng của vietnamwork, linkedlin)

Có thể xem các vị trí tuyển dụng.							

Có thể nôp CV ứng tuyển vào vị trí tuyển dụng.				

Có thể tạo CV trên hệ thống và sử dụng để apply vào vị trí tuyển dụng. ==> giống như 1 trang profile của ứng viên. ( tham khảo linkedin).

Vớt Interviewer

Chấm điểm ứng viên

Các câu hỏi suggestion cho buổi phỏng vấn theo từng skill, từng level.

Đọc được các CV, các thông tin của ứng viên được assigned phỏng vấn.

Hỗ trợ kết nối với các tool phỏng vấn online như team, zoom(optional ).

Với Admin

Toàn quyền kiểm soát hệ thống và quản lý người dùng.

Admin có được phần lớn các quyền về CRUD, nhưng vẫn sẽ không được can thiệp trực tiếp vào thông tin người dùng đưa lên như CV.


CHƯƠNG 4: QUÁ TRÌNH LÀM VIỆC CỦA CÁ NHÂN

- Sau khi định hướng được dự án Tuyển dụng, em được phân công về hiện thực quá trình xây dựng hồ sơ người dùng và cập nhật các thông tin của người dùng như bằng cấp, trình độ học vấn,…

Học cách sử dụng Git Lab

GitLab là một trang web dựa trên DevOps mã nguồn mở và là một phần mềm có chức năng và nhiệm vụ quản lý phiên bản mã nguồn, cung cấp một trình quản lý Git-repository. Trình quản lý này có các tiện ích như wiki, theo dõi sự cố và tích hợp liên tục. Bên cạnh đó là khả năng triển khai các tính năng pipeline và sử dụng license mã nguồn mở được phát triển bởi GitLab Inc.

Vì chúng ta đang làm một dự án gồm nhiều thành viên nên chúng sự dụng git lab để lưu project. Công ty cũng hướng dẫn em sử dụng câu lệnh đơn giản như “git pull”,  “git push”, “git checkout –b <branch-name>”, … để phục vụ cho việc lưu project và quản lý các phần được phân công của các bạn trong nhóm.

Vẽ ERD

Đây là bước quan trọng nhất trong dự án vì chúng ta phải hình dung dự án cần những gì, các bảng,  trường dữ liệu sẽ định nghĩa các thông tin ra sao và sự liên kết giữa các bảng dữ liệu với nhau diễn ra như thế nào.

Xây dựng các thực thể (Entity)

- Nhiệm vụ của em làm Profile và các tính năng liên quan đến Profile người dùng.

- Dựa vào ERD ở trên ta viết mã nguồn model cho Profile Ẻntity:


key: chroma:document
string_value:
Admin có được phần lớn các quyền về CRUD, nhưng vẫn sẽ không được can thiệp trực tiếp vào thông tin người dùng đưa lên như CV.


CHƯƠNG 4: QUÁ TRÌNH LÀM VIỆC CỦA CÁ NHÂN

- Sau khi định hướng được dự án Tuyển dụng, em được phân công về hiện thực quá trình xây dựng hồ sơ người dùng và cập nhật các thông tin của người dùng như bằng cấp, trình độ học vấn,…

Học cách sử dụng Git Lab

GitLab là một trang web dựa trên DevOps mã nguồn mở và là một phần mềm có chức năng và nhiệm vụ quản lý phiên bản mã nguồn, cung cấp một trình quản lý Git-repository. Trình quản lý này có các tiện ích như wiki, theo dõi sự cố và tích hợp liên tục. Bên cạnh đó là khả năng triển khai các tính năng pipeline và sử dụng license mã nguồn mở được phát triển bởi GitLab Inc.

Vì chúng ta đang làm một dự án gồm nhiều thành viên nên chúng sự dụng git lab để lưu project. Công ty cũng hướng dẫn em sử dụng câu lệnh đơn giản như “git pull”,  “git push”, “git checkout –b <branch-name>”, … để phục vụ cho việc lưu project và quản lý các phần được phân công của các bạn trong nhóm.

Vẽ ERD

Đây là bước quan trọng nhất trong dự án vì chúng ta phải hình dung dự án cần những gì, các bảng,  trường dữ liệu sẽ định nghĩa các thông tin ra sao và sự liên kết giữa các bảng dữ liệu với nhau diễn ra như thế nào.

Xây dựng các thực thể (Entity)

- Nhiệm vụ của em làm Profile và các tính năng liên quan đến Profile người dùng.

- Dựa vào ERD ở trên ta viết mã nguồn model cho Profile Ẻntity:

																@Entity

																@Table(name = "profile")

																@NoArgsConstructor

																@AllArgsConstructor

																@Getter

																@Setter

																@Builder

																public class Profile implements Serializable {

																    @Id

																    @GeneratedValue(strategy = GenerationType.IDENTITY)

																    private Long id;

																

																    @Column(name = "first_name", nullable = false)

																    private String firstName;

																

																    @Column(name = "last_name", nullable = false)

																    private String lastName;

																

																    @Column(name = "date_of_birth")

																    private LocalDate dob;

																

																    @Column(name = "contact_number")

																    private String contactNumber;

																

																    @Column(name = "image_url")

																    private String userImageURL;

																

																    @CreationTimestamp

																    private LocalDateTime createdDate;

																

																    @UpdateTimestamp

																    private LocalDateTime updatedDate;

																    private boolean enabled = true;

																    private String street;

																    private String district;

																    private String city;

																

																    @Enumerated(EnumType.STRING)

																    @Column(nullable = false)

																    private Gender gender;

																

																    @ManyToMany(fetch = FetchType.LAZY, targetEntity = CandidateSkill.class)


key: chroma:document
string_value:
public class Profile implements Serializable {

																    @Id

																    @GeneratedValue(strategy = GenerationType.IDENTITY)

																    private Long id;

																

																    @Column(name = "first_name", nullable = false)

																    private String firstName;

																

																    @Column(name = "last_name", nullable = false)

																    private String lastName;

																

																    @Column(name = "date_of_birth")

																    private LocalDate dob;

																

																    @Column(name = "contact_number")

																    private String contactNumber;

																

																    @Column(name = "image_url")

																    private String userImageURL;

																

																    @CreationTimestamp

																    private LocalDateTime createdDate;

																

																    @UpdateTimestamp

																    private LocalDateTime updatedDate;

																    private boolean enabled = true;

																    private String street;

																    private String district;

																    private String city;

																

																    @Enumerated(EnumType.STRING)

																    @Column(nullable = false)

																    private Gender gender;

																

																    @ManyToMany(fetch = FetchType.LAZY, targetEntity = CandidateSkill.class)

																    @JoinTable(

																        name = "profile_skill",

																        joinColumns = @JoinColumn(name = "profile_id"),

																        inverseJoinColumns = @JoinColumn(name = "candidate_skill_id")

																    )

																    private List<CandidateSkill> candidateSkills;

																

																    @ManyToMany(fetch = FetchType.LAZY, targetEntity = EducationDetail.class)

																    @JoinTable(

																        name = "profile_education",

																        joinColumns = @JoinColumn(name = "profile_id"),

																        inverseJoinColumns = @JoinColumn(name = "education_detail_id")

																    )

																    private List<EducationDetail> educationDetails;

																

																    @ManyToMany(fetch = FetchType.LAZY, targetEntity = ExperienceDetail.class)

																    @JoinTable(

																        name = "profile_experience_detail",

																        joinColumns = @JoinColumn(name = "profile_id"),

																        inverseJoinColumns = @JoinColumn(name = "experience_detail_id")

																    )

																    private List<ExperienceDetail> experienceDetails;

																

																    @OneToMany(fetch = FetchType.LAZY, targetEntity = Resume.class)

																    @JoinTable(

																        name = "profile_resume",

																        joinColumns = @JoinColumn(name = "profile_id"),

																        inverseJoinColumns = @JoinColumn(name = "resume_id")

																    )

																    private List<Resume> resumes;


key: chroma:document
string_value:
)

																    private List<CandidateSkill> candidateSkills;

																

																    @ManyToMany(fetch = FetchType.LAZY, targetEntity = EducationDetail.class)

																    @JoinTable(

																        name = "profile_education",

																        joinColumns = @JoinColumn(name = "profile_id"),

																        inverseJoinColumns = @JoinColumn(name = "education_detail_id")

																    )

																    private List<EducationDetail> educationDetails;

																

																    @ManyToMany(fetch = FetchType.LAZY, targetEntity = ExperienceDetail.class)

																    @JoinTable(

																        name = "profile_experience_detail",

																        joinColumns = @JoinColumn(name = "profile_id"),

																        inverseJoinColumns = @JoinColumn(name = "experience_detail_id")

																    )

																    private List<ExperienceDetail> experienceDetails;

																

																    @OneToMany(fetch = FetchType.LAZY, targetEntity = Resume.class)

																    @JoinTable(

																        name = "profile_resume",

																        joinColumns = @JoinColumn(name = "profile_id"),

																        inverseJoinColumns = @JoinColumn(name = "resume_id")

																    )

																    private List<Resume> resumes;

																

																    @Override

																    public int hashCode() {

																        return Objects.hash(id, firstName, lastName, dob, contactNumber, userImageURL, createdDate, updatedDate,

																            enabled, street, district, city, gender, candidateSkills, educationDetails, experienceDetails, resumes);

																    }

																

																    public String toString() {

																        return "Profile{ " +

																            "id=" + id +

																            ", firstName=" + firstName +

																            ", lastName=" + lastName +

																            ", dob=" + dob +

																            ", contactNumber=" + contactNumber +

																            ", userImageURL=" + userImageURL +

																            ", createdDate=" + createdDate +

																            ", updatedDate=" + updatedDate +

																            ", enabled=" + enabled +

																            ", street=" + street +

																            ", district=" + district +

																            ", city=" + city +

																            ", gender=" + gender +

																            ", candidateSkills=" + candidateSkills +

																            ", educationDetails=" + educationDetails +

																            ", experienceDetails=" + experienceDetails +

																            ", resumes=" + resumes +

																            "}";

																    }

																}

																

 Xây dựng Repository

																import org.springframework.data.jpa.repository.JpaRepository;

																import org.springframework.stereotype.Repository;


key: chroma:document
string_value:
}

																

																    public String toString() {

																        return "Profile{ " +

																            "id=" + id +

																            ", firstName=" + firstName +

																            ", lastName=" + lastName +

																            ", dob=" + dob +

																            ", contactNumber=" + contactNumber +

																            ", userImageURL=" + userImageURL +

																            ", createdDate=" + createdDate +

																            ", updatedDate=" + updatedDate +

																            ", enabled=" + enabled +

																            ", street=" + street +

																            ", district=" + district +

																            ", city=" + city +

																            ", gender=" + gender +

																            ", candidateSkills=" + candidateSkills +

																            ", educationDetails=" + educationDetails +

																            ", experienceDetails=" + experienceDetails +

																            ", resumes=" + resumes +

																            "}";

																    }

																}

																

 Xây dựng Repository

																import org.springframework.data.jpa.repository.JpaRepository;

																import org.springframework.stereotype.Repository;

																

																@Repository

																public interface ProfileRepository extends JpaRepository<Profile, Long> {

																}

 Xây dựng Service và ServiceImpl

																import java.util.List;

																import org.springframework.web.multipart.MultipartFile;

																

																public interface ProfileService {

																

																    ResponseTemplate<ProfileDto> getProfileById(Long id);

																

																    List<ProfileDto> getAllProfiles();

																

																    ResponseTemplate<ProfileDto> createProfile(ProfileDto profileDto);

																

																    ResponseTemplate<ProfileDto> updateProfile(Long id, ProfileDto profileDto);

																

																    boolean deleteProfile(Long id);

																}

																@Primary

																@Service

																@RequiredArgsConstructor

																public class ProfileServiceImpl implements ProfileService {

																

																    private final ProfileRepository profileRepository;

																    private final ProfileMapper profileMapper;

																

																    @Override

																    public ResponseTemplate<ProfileDto> getProfileById(Long id) {

																        Profile profile = profileRepository

																            .findById(id)

																            .orElseThrow(() -> new ResourceNotFoundException(String.format("Unknown id %s", id)));

																        ProfileDto profileToDto = profileMapper.toProfileDto(profile);

																        return ResponseTemplate.<ProfileDto>builder()

																            .code(HttpStatus.CREATED.value())

																            .data(profileToDto)


key: chroma:document
string_value:
public interface ProfileService {

																

																    ResponseTemplate<ProfileDto> getProfileById(Long id);

																

																    List<ProfileDto> getAllProfiles();

																

																    ResponseTemplate<ProfileDto> createProfile(ProfileDto profileDto);

																

																    ResponseTemplate<ProfileDto> updateProfile(Long id, ProfileDto profileDto);

																

																    boolean deleteProfile(Long id);

																}

																@Primary

																@Service

																@RequiredArgsConstructor

																public class ProfileServiceImpl implements ProfileService {

																

																    private final ProfileRepository profileRepository;

																    private final ProfileMapper profileMapper;

																

																    @Override

																    public ResponseTemplate<ProfileDto> getProfileById(Long id) {

																        Profile profile = profileRepository

																            .findById(id)

																            .orElseThrow(() -> new ResourceNotFoundException(String.format("Unknown id %s", id)));

																        ProfileDto profileToDto = profileMapper.toProfileDto(profile);

																        return ResponseTemplate.<ProfileDto>builder()

																            .code(HttpStatus.CREATED.value())

																            .data(profileToDto)

																            .build();

																    }

																

																    @Override

																    public List<ProfileDto> getAllProfiles() {

																        List<Profile> profiles = new ArrayList<>();

																        profiles.addAll(profileRepository.findAll());

																        return profileMapper.toProfileDtoList(profiles);

																    }

																

																    @Override

																    public ResponseTemplate<ProfileDto> createProfile(ProfileDto profileDto) {

																        Profile profile = profileMapper.toProfileEntity(profileDto);

																

																        profile.setFirstName(profileDto.getFirstName());

																        profile.setLastName(profileDto.getLastName());

																        profile.setDob(profileDto.getDob());

																        profile.setGender(Gender.valueOf(profileDto.getGender()));

																        profile.setContactNumber(profileDto.getPhoneNumber());

																        profile.setUserImageURL(profileDto.getAvatarImageUrl());

																

																        Profile savedProfile = profileRepository.save(profile);

																

																        ProfileDto profileToDto = profileMapper.toProfileDto(savedProfile);

																

																        return ResponseTemplate.<ProfileDto>builder()

																            .code(HttpStatus.CREATED.value())

																            .messages("Profile created successfully")

																            .data(profileToDto)

																            .build();

																    }


key: chroma:document
string_value:
List<Profile> profiles = new ArrayList<>();

																        profiles.addAll(profileRepository.findAll());

																        return profileMapper.toProfileDtoList(profiles);

																    }

																

																    @Override

																    public ResponseTemplate<ProfileDto> createProfile(ProfileDto profileDto) {

																        Profile profile = profileMapper.toProfileEntity(profileDto);

																

																        profile.setFirstName(profileDto.getFirstName());

																        profile.setLastName(profileDto.getLastName());

																        profile.setDob(profileDto.getDob());

																        profile.setGender(Gender.valueOf(profileDto.getGender()));

																        profile.setContactNumber(profileDto.getPhoneNumber());

																        profile.setUserImageURL(profileDto.getAvatarImageUrl());

																

																        Profile savedProfile = profileRepository.save(profile);

																

																        ProfileDto profileToDto = profileMapper.toProfileDto(savedProfile);

																

																        return ResponseTemplate.<ProfileDto>builder()

																            .code(HttpStatus.CREATED.value())

																            .messages("Profile created successfully")

																            .data(profileToDto)

																            .build();

																    }

																

																    @Override

																    public ResponseTemplate<ProfileDto> updateProfile(Long id, ProfileDto profileDto) {

																        Profile profile = profileRepository

																            .findById(id)

																            .orElseThrow(() -> new ResourceNotFoundException(String.format("Unknown id %s", id)));

																

																        if (profileDto.getFirstName() != null) {

																            profile.setFirstName(profileDto.getFirstName());

																        }

																        if (profileDto.getLastName() != null) {

																            profile.setLastName(profileDto.getLastName());

																        }

																        if (profileDto.getDob() != null) {

																            profile.setDob(profileDto.getDob());

																        }

																        if (profileDto.getGender() != null) {

																            profile.setGender(Gender.valueOf(profileDto.getGender()));

																        }

																        if (profileDto.getPhoneNumber() != null) {

																            profile.setContactNumber(profile.getContactNumber());

																        }

																        if (profileDto.getAvatarImageUrl() != null) {

																            profile.setUserImageURL(profile.getUserImageURL());

																        }

																

																        Profile updatedProfile = profileRepository.save(profile);

																

																        return ResponseTemplate.<ProfileDto>builder()

																            .code(HttpStatus.CREATED.value())


key: chroma:document
string_value:
.findById(id)

																            .orElseThrow(() -> new ResourceNotFoundException(String.format("Unknown id %s", id)));

																

																        if (profileDto.getFirstName() != null) {

																            profile.setFirstName(profileDto.getFirstName());

																        }

																        if (profileDto.getLastName() != null) {

																            profile.setLastName(profileDto.getLastName());

																        }

																        if (profileDto.getDob() != null) {

																            profile.setDob(profileDto.getDob());

																        }

																        if (profileDto.getGender() != null) {

																            profile.setGender(Gender.valueOf(profileDto.getGender()));

																        }

																        if (profileDto.getPhoneNumber() != null) {

																            profile.setContactNumber(profile.getContactNumber());

																        }

																        if (profileDto.getAvatarImageUrl() != null) {

																            profile.setUserImageURL(profile.getUserImageURL());

																        }

																

																        Profile updatedProfile = profileRepository.save(profile);

																

																        return ResponseTemplate.<ProfileDto>builder()

																            .code(HttpStatus.CREATED.value())

																            .messages("Profile updated successfully")

																            .data(profileMapper.toProfileDto(updatedProfile))

																            .build();

																    }

																

																    @Override

																    public boolean deleteProfile(Long id) {

																        Profile profile = profileRepository

																            .findById(id)

																            .orElseThrow(() -> new ResourceNotFoundException(String.format("Unknown id %s", id)));

																

																        profileRepository.delete(profile);

																        return true;

																    }

																

																}

 Xây dựng Controller

																@RestController

																@RequestMapping("/api/v1/profile")

																@RequiredArgsConstructor

																public class ProfileController {

																

																	private final ProfileService profileService;

																	private final AccountService accountService;

																

																	@Operation(

																        summary = "Create new profile",

																        description = "Use this endpoint to create a new profile"

																    )

																    @ApiResponse(

																        responseCode = "201",

																        description = "Successfully created"

																    )

																    @PostMapping

																    public ResponseEntity<ResponseTemplate<ProfileDto>> createProfile(@Valid @RequestBody ProfileDto profileDto) {

																        return ResponseEntity.status(HttpStatus.CREATED)


key: chroma:document
string_value:
}

																

																    @Override

																    public boolean deleteProfile(Long id) {

																        Profile profile = profileRepository

																            .findById(id)

																            .orElseThrow(() -> new ResourceNotFoundException(String.format("Unknown id %s", id)));

																

																        profileRepository.delete(profile);

																        return true;

																    }

																

																}

 Xây dựng Controller

																@RestController

																@RequestMapping("/api/v1/profile")

																@RequiredArgsConstructor

																public class ProfileController {

																

																	private final ProfileService profileService;

																	private final AccountService accountService;

																

																	@Operation(

																        summary = "Create new profile",

																        description = "Use this endpoint to create a new profile"

																    )

																    @ApiResponse(

																        responseCode = "201",

																        description = "Successfully created"

																    )

																    @PostMapping

																    public ResponseEntity<ResponseTemplate<ProfileDto>> createProfile(@Valid @RequestBody ProfileDto profileDto) {

																        return ResponseEntity.status(HttpStatus.CREATED)

																            .body(profileService.createProfile(profileDto));

																    }

																

																    @GetMapping("/{id}")

																    public ResponseEntity<ResponseTemplate> getProfile(@PathVariable long id) {

																        return ResponseEntity.ok(profileService.getProfileById(id));

																    }

																

																    @PutMapping("/update/{id}")

																    public ResponseEntity<ResponseTemplate<ProfileDto>> updateProfile(

																        @PathVariable Long id, @RequestBody ProfileDto profileDto) {

																        ResponseTemplate<ProfileDto> profile = profileService.updateProfile(id, profileDto);

																        return ResponseEntity.status(HttpStatus.CREATED).body(profile);

																    }

																

																    @DeleteMapping("/{id}")

																    public ResponseEntity<String> deleteProfile(@PathVariable Long id) {

																        boolean isDeleted = profileService.deleteProfile(id);

																        if (!isDeleted) {

																            String errorMessage = "Profile could not be deleted with id: %s".formatted(id);

																            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorMessage);

																        } else {

																            String successMessage = "Profile is deleted successfully!";

																            return ResponseEntity.ok(successMessage);

																        }

																    }

																

																	@GetMapping

																    public ResponseEntity<List<ProfileDto>> getAllProfile() {


key: chroma:document
string_value:
return ResponseEntity.ok(profileService.getProfileById(id));

																    }

																

																    @PutMapping("/update/{id}")

																    public ResponseEntity<ResponseTemplate<ProfileDto>> updateProfile(

																        @PathVariable Long id, @RequestBody ProfileDto profileDto) {

																        ResponseTemplate<ProfileDto> profile = profileService.updateProfile(id, profileDto);

																        return ResponseEntity.status(HttpStatus.CREATED).body(profile);

																    }

																

																    @DeleteMapping("/{id}")

																    public ResponseEntity<String> deleteProfile(@PathVariable Long id) {

																        boolean isDeleted = profileService.deleteProfile(id);

																        if (!isDeleted) {

																            String errorMessage = "Profile could not be deleted with id: %s".formatted(id);

																            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorMessage);

																        } else {

																            String successMessage = "Profile is deleted successfully!";

																            return ResponseEntity.ok(successMessage);

																        }

																    }

																

																	@GetMapping

																    public ResponseEntity<List<ProfileDto>> getAllProfile() {

																        return ResponseEntity.ok(profileService.getAllProfiles());

																    }

																

																	@PatchMapping

																	public ResponseEntity<ResponseTemplate<ProfileDto>> editProfile(

																		@Valid @RequestPart(value = "data") ProfileDto profileDto,

																		@RequestPart(required = false, value = "avatar") MultipartFile avatarImage,

																		Principal principal

																	) {

																		var savedProfile = accountService.editProfile(principal.getName(),

																			DtoUtil.filterNullValue(profileDto), avatarImage);

																		var result = ResponseTemplate.<ProfileDto>builder()

																			.code(HttpStatus.OK.value())

																			.data(savedProfile)

																			.messages("Updated Successfully")

																			.build();

																		return ResponseEntity.ok(result);

																	}

																    @GetMapping("/{id}")

																    public ResponseEntity<ResponseTemplate<ProfileDto>> getProfileById(@PathVariable Long id) {

																        ProfileDto profileDto = accountService.getProfileById(id);

																        if (profileDto == null) {

																            return ResponseEntity.notFound().build();

																        }

																        var result = ResponseTemplate.<ProfileDto>builder()

																                .code(HttpStatus.OK.value())

																                .data(profileDto)

																                .messages("Profile retrieved successfully")

																                .build();

																        return ResponseEntity.ok(result);

																    }

																}


key: chroma:document
string_value:
@RequestPart(required = false, value = "avatar") MultipartFile avatarImage,

																		Principal principal

																	) {

																		var savedProfile = accountService.editProfile(principal.getName(),

																			DtoUtil.filterNullValue(profileDto), avatarImage);

																		var result = ResponseTemplate.<ProfileDto>builder()

																			.code(HttpStatus.OK.value())

																			.data(savedProfile)

																			.messages("Updated Successfully")

																			.build();

																		return ResponseEntity.ok(result);

																	}

																    @GetMapping("/{id}")

																    public ResponseEntity<ResponseTemplate<ProfileDto>> getProfileById(@PathVariable Long id) {

																        ProfileDto profileDto = accountService.getProfileById(id);

																        if (profileDto == null) {

																            return ResponseEntity.notFound().build();

																        }

																        var result = ResponseTemplate.<ProfileDto>builder()

																                .code(HttpStatus.OK.value())

																                .data(profileDto)

																                .messages("Profile retrieved successfully")

																                .build();

																        return ResponseEntity.ok(result);

																    }

																}

 Merge code, Fix bug và hoàn thiện project

- Sau khi thực hiện hết các bước, Cả nhóm bắt đầu hợp nhất mã nguồn(Merge Code), trong quá trình merge code sẽ xuất hiện conflict -> yêu cầu các thành viên cần tìm hiểu về resolve conflict. 

- Sau khi merge code, nhóm sẽ chạy thử project để xem trình tự hoạt động của các tính năng và phát hiện các lỗi phát sinh, khi đó nhóm sẽ cùng sửa lỗi.

- Thảo luận với Front-End về các lỗi gặp phải khi triển khai cơ sở dữ liệu(Deploy database) và giải thích sự di chuyển của các luồng dữ liệu khi gọi các method GET hoặc POST.

- Xử lý message lỗi và phối hợp với Front-End để kiểm tra lỗi xảy ra trong các trường hợp nào. 

- Phân quyền cho từng API.

CHƯƠNG 5: TỔNG KẾT

- Trong lúc thực tập tại FPT-Software, em đã tiếp thu nhiều kiến thức. Trong đó:

Ưu điểm:

Thấy và tiếp thu thái độ khi làm việc trên công ty

Các anh chị Mentor và Admin tận tình hướng dẫn, giới thiệu công nghệ mới, quy trình làm việc.

Các bạn trong nhóm hòa đồng, đoàn kết.

Công ty còn tổ chức nhiều hoạt động cho sinh viên như Code War, Bóng đá và English Speaking Club.

Hoàn thành Project đúng thời hạn.

Nhược điểm:

Bản thân có chút choáng ngợp trước quy mô của một dự án thực tế.

Conflict source code khá nhiều vì sự khác biệt về góc độ tiếp cận dự án.

Chưa tối ưu sức mạnh của các thư viện của Java Spring Boot, cá nhân em sử dụng mã nguồn tiêu chuẩn trong project còn cứng nhắc.


key: chroma:document
string_value:
}

																}

 Merge code, Fix bug và hoàn thiện project

- Sau khi thực hiện hết các bước, Cả nhóm bắt đầu hợp nhất mã nguồn(Merge Code), trong quá trình merge code sẽ xuất hiện conflict -> yêu cầu các thành viên cần tìm hiểu về resolve conflict. 

- Sau khi merge code, nhóm sẽ chạy thử project để xem trình tự hoạt động của các tính năng và phát hiện các lỗi phát sinh, khi đó nhóm sẽ cùng sửa lỗi.

- Thảo luận với Front-End về các lỗi gặp phải khi triển khai cơ sở dữ liệu(Deploy database) và giải thích sự di chuyển của các luồng dữ liệu khi gọi các method GET hoặc POST.

- Xử lý message lỗi và phối hợp với Front-End để kiểm tra lỗi xảy ra trong các trường hợp nào. 

- Phân quyền cho từng API.

CHƯƠNG 5: TỔNG KẾT

- Trong lúc thực tập tại FPT-Software, em đã tiếp thu nhiều kiến thức. Trong đó:

Ưu điểm:

Thấy và tiếp thu thái độ khi làm việc trên công ty

Các anh chị Mentor và Admin tận tình hướng dẫn, giới thiệu công nghệ mới, quy trình làm việc.

Các bạn trong nhóm hòa đồng, đoàn kết.

Công ty còn tổ chức nhiều hoạt động cho sinh viên như Code War, Bóng đá và English Speaking Club.

Hoàn thành Project đúng thời hạn.

Nhược điểm:

Bản thân có chút choáng ngợp trước quy mô của một dự án thực tế.

Conflict source code khá nhiều vì sự khác biệt về góc độ tiếp cận dự án.

Chưa tối ưu sức mạnh của các thư viện của Java Spring Boot, cá nhân em sử dụng mã nguồn tiêu chuẩn trong project còn cứng nhắc.

Qua 8 tuần làm quen với công việc, tuy chỉ là một thực tập sinh nhưng em đã có được cái nhìn tổng quan hơn về mảng Spring Boot, có cơ hội để làm quen được phần mềm và các công cụ đi kèm. Công ty đã hỗ trợ em hết mình, cả về vật chất lẫn tinh thần, tạo mọi điều kiện thuận lợi cho em có thể dễ tiếp thu và nắm bắt nguồn kiến thức mới. Sau kì thực tập này, em mong rằng mọi kiến thức thu thập được sẽ góp phần không nhỏ trên bước đường của em sau này, trong cuộc sống cũng như trong môi trường làm việc. Em xin cảm ơn nhà trường đã tạo điều kiện cho em thực tập trong một công ty như FPT này.

Tp. Hồ Chí Minh, ngày… tháng … năm …….

Sinh viên báo cáo

(Ký, ghi rõ họ và tên)

Người đánh giá

(Ký, ghi rõ họ và tên)

Ban lãnh đạo công ty

(Ký, ghi rõ họ và tên)

15


