MCPcopy Index your code
hub / github.com/coder/coder / UploadFile

Method UploadFile

coderd/provisionerdserver/provisionerdserver.go:1488–1542  ·  view source on GitHub ↗
(stream proto.DRPCProvisionerDaemon_UploadFileStream)

Source from the content-addressed store, hash-verified

1486}
1487
1488func (s *server) UploadFile(stream proto.DRPCProvisionerDaemon_UploadFileStream) error {
1489 var file *sdkproto.DataBuilder
1490 // Always terminate the stream with an empty response.
1491 //nolint:errcheck // We can't do much about send errors here.
1492 defer stream.SendAndClose(&proto.Empty{})
1493
1494 file, err := provisionersdk.HandleReceivingDataUpload(stream)
1495 if err != nil {
1496 return err
1497 }
1498
1499 fileData, err := file.Complete()
1500 if err != nil {
1501 return xerrors.Errorf("complete file upload: %w", err)
1502 }
1503
1504 // Just rehash the data to be sure it is correct.
1505 hashBytes := sha256.Sum256(fileData)
1506 hash := hex.EncodeToString(hashBytes[:])
1507
1508 var insert database.InsertFileParams
1509
1510 switch file.Type {
1511 case sdkproto.DataUploadType_UPLOAD_TYPE_MODULE_FILES:
1512 insert = database.InsertFileParams{
1513 ID: uuid.New(),
1514 Hash: hash,
1515 CreatedAt: dbtime.Now(),
1516 CreatedBy: uuid.Nil,
1517 Mimetype: tarMimeType,
1518 Data: fileData,
1519 }
1520 default:
1521 return xerrors.Errorf("unsupported file upload type: %s", file.Type)
1522 }
1523
1524 //nolint:gocritic // Provisionerd actor
1525 _, err = s.Database.InsertFile(dbauthz.AsProvisionerd(s.lifecycleCtx), insert)
1526 if err != nil {
1527 // Duplicated files already exist in the database, so we can ignore this error.
1528 if !database.IsUniqueViolation(err, database.UniqueFilesHashCreatedByKey) {
1529 return xerrors.Errorf("insert file: %w", err)
1530 }
1531 }
1532
1533 s.Logger.Info(s.lifecycleCtx, "file uploaded to database",
1534 slog.F("type", file.Type.String()),
1535 slog.F("hash", hash),
1536 slog.F("size", len(fileData)),
1537 // new_insert indicates whether the file was newly inserted or already existed.
1538 slog.F("new_insert", err == nil),
1539 )
1540
1541 return nil
1542}
1543
1544// DownloadFile pulls the requested file from the database and sends it over the protobuf stream in chunks.
1545func (s *server) DownloadFile(request *proto.FileRequest, stream proto.DRPCProvisionerDaemon_DownloadFileStream) error {

Callers

nothing calls this directly

Calls 11

CompleteMethod · 0.95
NowFunction · 0.92
AsProvisionerdFunction · 0.92
IsUniqueViolationFunction · 0.92
SendAndCloseMethod · 0.65
NewMethod · 0.65
InsertFileMethod · 0.65
ErrorfMethod · 0.45
InfoMethod · 0.45
StringMethod · 0.45

Tested by

no test coverage detected