'Update "shared" state of a file/folder with google drive API

I can't resolve how to change "shared" state to false with the google drive API.

Here is what i do:

  1. I fetch all my folders & files witch are public with [this one][1] (I use q:"'me' in owners and visibility != 'limited'" filter)

  2. I take file/folder ID and put it inside [this other one][2] Inside the response object I got this line i want to change : "shared": true

I don't where I can set it to false, is someone getting any idea?

Have a nice day


Edit: I use NodeJs (netlify function), here is my code to get my files & folders :

const { google } = require('googleapis')
const CLIENT_ID = process.env.CLIENT_ID
const CLIENT_SECRET = process.env.CLIENT_SECRET
const REDIRECT_URI = 'https://developers.google.com/oauthplayground'

const REFRESH_TOKEN = process.env.REFRESH_TOKEN

exports.handler = async () => {
  const oauth2Client = new google.auth.OAuth2(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI)
  oauth2Client.setCredentials({ refresh_token: REFRESH_TOKEN })

  const drive = google.drive({
    version: 'v3',
    auth: oauth2Client,
  })

  try {
    const result = await drive.files.list({
      q:"'me' in owners and visibility != 'limited'"
    })

    return {
      statusCode: 200,
      headers: {
        'Access-Control-Allow-Origin': '*',

      },
      body: JSON.stringify({ ...result, Body: result.toString('utf-8') })
    }
  } catch (e) {
    console.log(e.message)
    return { statusCode: 500, body: e.message }
  }
}

To change visibility ("shared": true -> "shared": false), I tried @Tanaike answer with :

const fetch = require('node-fetch')

const API_ENDPOINT_A = 'DELETE https://www.googleapis.com/drive/v3/files/'
const API_ENDPOINT_B = '/permissions/anyoneWithLink'

exports.handler = async (event) => {
  try {
    const itemId = '1-7ESYk_zKJ5Sdfg_z-XiuoXxrKKpHwSa' // event.queryStringParameters.itemId
    const response = await fetch(API_ENDPOINT_A + itemId + API_ENDPOINT_B)
    const data = await response.json()
    return {
      statusCode: 200,
      headers: {
        'Access-Control-Allow-Origin': '*'
      },
      body: JSON.stringify({ data })
    }
  } catch (error) {
    console.log(error)
    return {
      statusCode: 500,
      body: JSON.stringify({ error: 'Failed fetching data' })
    }
  }
}

But i don't know how I can pass my private info (api key...), I used OAuth 2 for fetch, should I use it too for edit visibility ? [1]: https://developers.google.com/drive/api/v2/reference/files/list [2]: https://developers.google.com/drive/api/v2/reference/files/patch



Solution 1:[1]

If I understand correctly, you are unable to see the place where you can change the file to "shared": true. If so, in the same link you provided from the official documentation you can find it in the "Request body".

Sample image

Solution 2:[2]

From I fetch all my folders & files witch are public with this one (I use q:"'me' in owners and visibility != 'limited'" filter), when you want to change the permission of publicly shared to the restricted, you can achieve this using Drive API as follows.

Request:

Permissions: delete is used.

DELETE https://www.googleapis.com/drive/v3/files/###fileId###/permissions/anyoneWithLink

Sample curl:

curl --request DELETE \
  -H 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \
  'https://www.googleapis.com/drive/v3/files/###fileId###/permissions/anyoneWithLink'
  • If the file is publicly shared and not shared with other specific users, when this request is run, "shared": true is changed to "shared": false.

Note:

  • If you want to remove the permission of the specific user, you can achieve this as follows.

    1. Retrieve the permission ID using Permissions: list.

       curl \
         -H 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \
         'https://www.googleapis.com/drive/v3/files/###fileId###/permissions'
      
    2. Using the retrieved permission ID, you can delete the permission as follows.

       curl --request DELETE \
         -H 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \
         'https://www.googleapis.com/drive/v3/files/###fileId###/permissions/###permissionId###'
      

References:

Added:

From your following replying,

I actualy use nodejs for drive API, I tried the http solution, but idk how can i pass my clientId and secretId (error 500), You can find my code on my question, i edited it

When you want to achieve to delete permissions with googleapis for Node.js, you can use the following script. In this case, please include the scope of https://www.googleapis.com/auth/drive.

Sample script:

const fileId = "###"; // Please set your file ID.

const drive = google.drive({ version: "v3", auth }); // Please use your client here.
drive.permissions.delete(
  {
    fileId: fileId,
    permissionId: "anyoneWithLink",
  },
  (err, res) => {
    if (err) {
      console.error(err);
      return;
    }
    console.log(res.data); // In this case, no values are returned.
  }
);
  • In this sample script, the permission of the publicly shared file is deleted.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Fernando Lara
Solution 2